2010-08-03 3 views
0

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

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

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

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

поверхность CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_surface_Tare surface_revC.pdf

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

Поверхностно-CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_surface_Tare surface_revC.pdf

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

Поверхностно-CoP-20-70-0000-04-02_Pre-Run_Tool_Verification_Programming_and_Surface_Tare surface_revC.pdf

+0

Можете ли вы использовать '\ b' вместо своего тяжелого соответствия lookbehind? – strager

+2

FYI, '/ surface? /' Соответствует '' surfac''. 'e?' делает опцию 'e' опциональной. Может быть, вы хотите '(поверхность)?', Или, может быть, вам нужно что-то еще (это непонятно). – polygenelubricants

ответ

1

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

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

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

Или это:

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

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


Update: дал следующую информацию:

surface2010 не должно совпадать

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

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

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

+0

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

+0

Определите символ «без слов». В регулярном выражении символом слова ('\ w') является' [A-Za-z0-9_] ', который может и не быть тем, что вы хотите - отсюда два варианта, которые я разместил выше. Первая из них (или небольшая адаптация) должна дать вам то, что вы хотите. (Флаг 'i' делает его нечувствительным к регистру, и маловероятно, что PHP имеет в этом ошибку.) –

0

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

/\bsurface\b/i 
+0

Это не будет соответствовать' _surface_', потому что '\ b' - это изменение между' \ w' и '\ W' и символ '_' включен в' \ w'. –

+0

@Peter Boughton, Затем сделайте что-то вроде: '/ (? <= _ | \ B) surface (? = _ | \ B)/i' – strager

+0

Да, это похоже на мой' [\ W_] 'one, хотя который не будет соответствовать только «поверхности» - но, вероятно, первый из них, который я перечислил, является предпочтительным. Нужно уточнить из ОП, следует ли сопоставлять «surface2010» или нет. –

0

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

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

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

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