表情的正则表达式

时间:2016-06-15 14:18:04

标签: java regex

有这个正则表达式:

(:?^|\s)+(;\))+

如果单独出现(在空格之间)或在行首开始,我尝试捕获所有出现的事件。 有效示例

;)
 ;) 
;) ;) -> Should be 2 groups of ;)

Dont allow
a;)a
a;) 
;)a

当前的正则表达式只捕获第一组;);)case因为第二个;)期望一个空格,但它被第一组使用..

3 个答案:

答案 0 :(得分:4)

您可以使用lookarounds匹配;)

(?<=\s|^);\)(?=\s|$)

RegEx Demo

  • (?<=\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)"