Что не так с этим регулярным выражением? - PullRequest
0 голосов
/ 03 августа 2010

У меня есть следующее регулярное выражение, чтобы найти слово в тексте и выделить его

Использование поверхности слова для тестирования.

/((?<=[\W])surface?(?![\w]))|((?<![\w])surface?(?=[\W]))/iu

Соответствует всем вхождениям в следующем тексте.

surface-CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_surface_Tare surface_revC.pdf

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

Surface-CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_surface_Tare surface_revC.pdf

Или, если я поставлю верхнийрегистр букв в некоторых других случаях соответствует этому.

Surface-CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_Surface_Tare surface_revC.pdf

Ответы [ 3 ]

1 голос
/ 03 августа 2010

Я понятия не имею, чего вы пытаетесь достичь, но, возможно, ваша проблема в том, что \w будет включать _\W исключит его).

Может быть, попробовать это:

/(?<![a-z])surface(?![a-z])/iu

Или это:

/(?<=[\W_])surface(?=[\W_])/iu

В противном случае, предоставьте более подробную информацию о том, что именно вы делаете / не хотите соответствовать.


Обновление: с учетом этой информации:

поверхность2010 не должна совпадать

В таком случае, я подозреваю, что вы хотите:

/(?<=\b|_)surface(?=\b|_)/iu

(поскольку только \b исключает совпадение, содержащее "... and_surface_Tare ...", поэтому мы добавляем чередование с _, чтобы включить это.)

0 голосов
/ 04 августа 2010

Таким образом, вы хотите сопоставить surface без учета регистра, если за ним не следует или не следует сразу же за буквой или цифрой? Попробуйте это:

/(?<![A-Za-z0-9])surface(?![A-Za-z0-9])/i

Я остановил модификатор /u (который заставляет регулярное выражение и строку темы обрабатываться как UTF-8), потому что вы, похоже, имеете дело с чистым текстом ASCII. \w, \W и \b никак не зависят от /u.

0 голосов
/ 03 августа 2010

Я что-то упустил?

/\bsurface\b/i
...