这个正则表达式有什么问题?

时间:2010-08-03 13:38:33

标签: php regex pcre

我有以下正则表达式来查找文本中的单词并突出显示它们

使用word表面进行测试。

/((?<=[\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 个答案:

答案 0 :(得分:1)

我不知道你想要在那里实现什么,但可能你的问题是\w将包含_(而\W会排除它。)

也许试试这个:

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

或者这个:

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

否则,请提供更多详细信息,说明您确实/不想要匹配的内容。


更新:根据以下信息:

  

surface2010不应匹配

在这种情况下,我怀疑你想要:

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

(因为只有\b会排除包含“... and_surface_Tare ...”的匹配,因此我们将_的替换添加到其中以包含该内容。)

答案 1 :(得分:0)

我错过了什么吗?

/\bsurface\b/i

答案 2 :(得分:0)

所以你想要surface不区分大小写,除非它之前或之后是字母或数字?试试这个:

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

我不使用/u修饰符(导致正则表达式和主题字符串被视为UTF-8),因为您似乎正在处理纯ASCII文本。 \w\W\b不受/u的影响。