Regex, чтобы найти слово, которое содержит экранированный символ - PullRequest
0 голосов
/ 17 июля 2009

Я использую простое регулярное выражение (в C #), чтобы найти целое слово в блоке текста.

Слово может появляться в начале, конце или в середине текста или предложения в тексте.

Выражение, которое я использовал \bword\b работало нормально, однако, если слово включало специальный символ (который был экранирован), оно больше не работает. Граница необходима, чтобы мы не выбирали такие слова, как vb.net, как совпадающие с .net.

Два примера, которые терпят неудачу:

\bc\#\b

\b\.net\b

Я могу изменить границу слова на список других проверок, например, не в начале без пробелов и т. Д. Однако это сложно и может быть медленным, если используется для большого количества слов.

Ответы [ 3 ]

3 голосов
/ 17 июля 2009

\b соответствует границе между символами слова и несловесными символами, но не совпадает с границей между двумя несловесными символами.

Например, в случае C# существует граница между C (символом слова) и # (не состоящим из символов), но не между # и тем, что следует после него (пробел, пунктуация, конец строки и т. д.).

Вы можете обойти эту проблему следующим образом:

  • Используйте (?:^|\W) вместо \b в начале выражения.
    Например, (?:^|\W)\.NET\b
    Это будет соответствовать либо символу начала строки, либо символу, не являющемуся словом, перед символом ..
  • Используйте (?:\W|$) вместо \b в конце выражения.
    Например, \bC#(?:\W|$)
    Это будет соответствовать либо несловесному символу, либо концу строки после символа #.
3 голосов
/ 18 июля 2009

Я бы посоветовал негативные взгляды:

(?<!\w)c#(?!\w)

(?<!\w)\.net(?!\w)

Это должно быть быстрее, чем сопоставление якорей или несловарных символов, таких как (?:^|\W), плюс вам не нужно иметь дело с посторонними символами, когда совпадает \W.

0 голосов
/ 17 июля 2009

Это не совпадение, потому что экранированные символы (# и.) Не являются символами слова, поэтому между ними и пробелом / etc нет границы слова (\ b). Возможно, ищите пробелы / бол / eol / и т. Д. Конкретно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...