2016-06-15 2 views
0

есть это регулярное выражение:Regex для смайлика

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

Im tryng захватить все вхождения;), если он появляется только один (между пробелами) или в начале строки. Правильные примеры

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

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

Текущее регулярное выражение просто захватывает первую группу для;);) случай, потому что второй;) ожидает для пространства, но его используют первой группы ..

+0

Каково ваше регулярное выражение? –

+0

Что это значит? Я буду использовать его в приложении Java. – colymore

+0

Так что это Java. Это означает язык, который вы используете :) –

ответ

3

Вы можете соответствовать ;) с помощью lookarounds:

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

RegEx Demo

  • (?<=\s|^) является оглядывайся, утверждающее начало строки или пробел находится на предыдущей позиции
  • (?=\s|$) это смотреть вперед, что соответствует концу строки или пробел находится в следующем положении

В Java:

Pattern p = Pattern.compile("(?<=\\s|^);\\)(?=\\s|$)"); 
0

Наконец использование для «границы не слова» \ В

Pattern winkwink = Pattern.compile("\\B(;[)])\\B"); 

Хорошо, хорошо. Я признаю, что это работает для примеров.
Но также будет соответствовать ;), который окружен другими символами, отличными от слова, чем пробелами.
Как, например, в (;)). Итак, i.m.h.o., метод с внешним видом еще лучше. ;)

0

Я хотел бы предложить более краткое решение, основанное lookaround:

String rx = "(?x)(?<!\\S) ;\\) (?!\\S)"; 

ВИДЕТЬ regex demo

Объяснение:

  • (?x) - COMMENTS modifier гарантируя, что все рисунка пробелы игнорируются, а встроенные комментарии, начинающиеся с #, игнорируются до тех пор, пока конец строки (так что мы можем лучше увидеть части рисунка)
  • (?<!\\S) - отрицательная назад 'провалив матч, если ;) предшествуют с непробельным полукоксом
  • ;\\) - буквальным ;)
  • (?!\\S) - отрицательный результат, который не соответствует совпадению, если после ;) есть символ без пробелов.

Смотрите Java demo с replaceAll, чтобы показать, что это находит только те ;) вам нужно:

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>")); 

Если вы хотите еще больше усилить картину, и вы не чувствуете себя комфортно с модификатором КОММЕНТАРИЕВ, удалить его , Затем используйте "(?<!\\S);\\)(?!\\S)".

Смежные вопросы