有这个正则表达式:
(:?^|\s)+(;\))+
如果单独出现(在空格之间)或在行首开始,我尝试捕获所有出现的事件。 有效示例
;)
;)
;) ;) -> Should be 2 groups of ;)
Dont allow
a;)a
a;)
;)a
当前的正则表达式只捕获第一组;);)case因为第二个;)期望一个空格,但它被第一组使用..
答案 0 :(得分:4)
您可以使用lookarounds匹配;)
:
(?<=\s|^);\)(?=\s|$)
(?<=\s|^)
看起来断言行开头或空格位于前一个位置(?=\s|$)
向前看,匹配行结束或空白位于下一个位置在Java中:
Pattern p = Pattern.compile("(?<=\\s|^);\\)(?=\\s|$)");
答案 1 :(得分:0)
最后用于“非字边界”\ B
Pattern winkwink = Pattern.compile("\\B(;[)])\\B");
好的,好的。我承认它适用于这些例子
但也会匹配由空格以外的其他非单词字符包围的;)
例如在(;))
中。所以i.m.h.o.,环顾四周的方法仍然更好。 ;)
答案 2 :(得分:0)
我想建议一个更简洁的基于外观的解决方案:
String rx = "(?x)(?<!\\S) ;\\) (?!\\S)";
请参阅regex demo
<强>解释强>:
(?x)
- COMMENTS modifier确保忽略所有模式空白,并忽略以#
开头的嵌入式注释,直到行尾(这样我们才能更好地看到模式)(?<!\\S)
- 如果;)
前面有非空白字符,则会导致比赛失败,;\\)
- 文字;)
(?!\\S)
- 如果在;)
之后存在非空格字符,则会导致匹配失败的否定前瞻。使用replaceAll
查看Java demo以显示它只找到您需要的;)
:
String s = ";)\n ;) \n;) ;) -> Should be 2 groups of ; )\n\nDont allow\na;)a\na;) \n;)a";
System.out.println(s.replaceAll("(?x)(?<!\\S) ;\\) (?!\\S)", "<found>$0</found>"));
如果您想进一步增强图案并且对COMMENTS修改器感觉不舒服,请将其删除。然后使用"(?<!\\S);\\)(?!\\S)"
。