2014-01-10 3 views
3

Так что я знаю, что мне нужно использовать lookahead и lookbehind, но я начинаю терять рассудок.Соответствует точке/периоду, если не следовать И предшествует один символ

Поэтому вы можете привести пример и объяснение того, что это значит.

Мне нужно совместить точки в следующей последовательности, но не в том, что между отдельными символами.

this.is.a.sentence.e.g. 

При удалении совпавших точек вы должны быть оставлены с:

this is a sentence e.g 

Ответ должен работать в различных регулярных выражениях двигателей, поэтому предпочтительные является чем-то общим, но если это проще, я Я уверен, что смогу работать с .NET.

ответ

3

Lookbehinds широко не поддерживается, и ваши требования затрудняют их использование. Возможно, выше регулярное выражение гуру может обеспечить решение, которое не использует их, но сейчас вот то, что у меня есть:

(?:  # do not capture 
^   # anchor to start of line 
|   # alternation 
(?<=  # lookbehind 
    [^.]{2} # two non-period characters 
) 
) 
\.   # a literal period 
|   # alternation 
\.   # a literal period 
(?:  # do not capture 
$   # anchor to end of line 
|   # alternation 
(?=  # lookahead 
    [^.]{2} # two non-period characters 
) 
) 

По существу, это делает две чередующиеся проверки: период, который предшествует либо в начале строки или два не-период символы, или период, который следует либо в конце строки или два не-период символов.

Это работает для конкретного примера: http://rubular.com/r/3ueTN37Smh

Можно также обрабатывать делать на замену таким образом:

s/(^|[^.]{2})\.|\.($|[^.]{2})/\1 \2/ 

Это захватывает два предыдущие или следующие символы вместо и вставляет их назад как часть совпадение. Это проще и, вероятно, доступно для большего количества языков.

+1

Единственный популярный язык, который вам нужно будет беспокоиться об этом, который не работает, - это javascript .. кроме этого, он должен хорошо работать в разных системах. – brandonscript

+0

спасибо, Это действительно работает, однако, пожалуйста, вы можете сломать его и объяснить, как я сказал в вопросе, я хочу знать, как это работает, а не только ответ (покажите свои работы, как обычно говорил мой учитель математики) – Martin

+0

@ Мартин добавил объяснение –

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