regex 匹配并删除方括号模式中的所有空格

jxct1oxe  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(142)

我想匹配字符串中每个[[]]内的所有空格,这样我就可以使用replaceAll方法删除它们。
输入示例:text text [[ ia asd ]] [[asdasd]] dfgd dfaf sddgsd [[sss aaa]]
预期输出:text text [[iaasd]] [[asdasd]] dfgd dfaf sddgsd [[sssaaa]]
我想到了这一点:\[\[(\s*?)\]\],它应该匹配双括号之间的所有空格,但它不匹配任何内容。
我也尝试了其他几个解决类似问题的方法,但似乎都不起作用。
你知道还有什么别的办法吗?

xtupzzrd

xtupzzrd1#

考虑到它是Java,您可以使用

String result = text.replaceAll("(\\G(?!^)|\\[\\[)((?:(?!]]).)*?)\\s+(?=.*?]])", "$1$2")

或者,另一种方法是匹配[[]]之间的所有子字符串,然后删除匹配项中的任何空格:

String text = "text text [[ ia asd ]] [[asdasd]] dfgd dfaf sddgsd [[sss aaa]]";
Pattern p = Pattern.compile("\\[\\[.*?]]");
Matcher m = p.matcher(text);
StringBuffer buffer = new StringBuffer();
while(m.find()) {
    m.appendReplacement(buffer, m.group().replaceAll("\\s+", ""));
}
m.appendTail(buffer);
System.out.println(buffer.toString());

请参阅Java demo online
第一个正则表达式表示:

  • (\G(?!^)|\[\[)-第1组($1):[[或前面成功匹配的结尾
  • ((?:(?!]]).)*?)-第2组($2):除换行符字符以外的任何字符,零个或多个但尽可能少地出现,且不启动]]字符序列
  • \s+-一个或多个空格
  • (?=.*?]])-紧靠右侧,必须有除换行符字符以外的任何零个或多个字符,尽可能少,然后是]]

相关问题