如何使用正则表达式替换某些模式之间的空白

How to substitute blanks between certain patterns using regex

我想替换 $# 和结尾 # 之间的空格。

测试字符串:

This is my variable A $#testpattern 1# and this is variable B $#testpattern 2 with multiple blanks#

预期结果:

This is my variable A $#testpattern1# and this is variable B $#testpattern2withmultipleblanks#

当它只有一个空白时,我可以使用它,但是当有多个空白时,它就不起作用了。

当前正则表达式:

/(?<=$#)(\w*?)(\s*?)(\w*?)(?=#)

这是一种方法。

  • \$#(.*?)# - 捕获分隔符之间的字符串
  • 找到模式中的每个捕获组。
  • 删除该组中的空白。
  • 然后在原始字符串中,将捕获的字符串替换为修改后的字符串。
String s = "This is my variable A $#testpattern 1# and this is variable B $#testpattern 2 with multiple blanks#";

Pattern p = Pattern.compile("\$#(.*?)#");
Matcher m =p.matcher(s);
while (m.find()) {
    String str = m.group(1).replace(" ","");
    s = s.replace(m.group(1),str);
}
System.out.println(s);

打印

This is my variable A $#testpattern1# and this is variable B $#testpattern2withmultipleblanks#

Java 支持 lookbehind 断言中的有限量词,因此您可以向其添加可选的单词字符或空格 [\w\s]{0,100} 而对于 lookahead,您只能添加 [\w\s]* 匹配 1或中间有更多空白字符。

(?<=$#[\w\s]{0,100})\s+(?=[\w\s]*#)

例如

String string = "This is my variable A $#testpattern 1# and this is variable B $#testpattern 2 with multiple blanks#";
System.out.println(string.replaceAll("(?<=\$#[\w\s]{0,100})\s+(?=[\w\s]*#)", ""));

输出

This is my variable A $#testpattern1# and this is variable B $#testpattern2withmultipleblanks#

看到一个Java demo and a Regex demo