最初,我使用的只是单词边界来进行精确的单词匹配 - https://regex101.com/r/M97FkV/4
更新1 :
1)与20-year-old
year's
,只有year's
完全匹配 - 单独搜索year
,与year's
20-year-old
,则确切20-year-old
匹配 - 搜索20
或year
或old
与20-year-old
不匹配
2)标点符号之前或之后的完全匹配词
old
,确切字词或标点符号之前或之后old
.old
old.
-old
old-
_old
{ {1}} old_
old'
这些将匹配。 - 'old
与其中带标点符号的字词old
不匹配。
我们的最新进展
https://regex101.com/r/M97FkV/15 - 解决(2)但不解决(1)
https://regex101.com/r/M97FkV/16 - 解决(1)但不解决(2)
答案 0 :(得分:0)
包括不区分大小写和unicode卷曲单引号......
模式:/(?:^|\s)[-_,'’.]*\Kold(?=[-_,'’.]*(?:\s|$))/ui
替换:young
演示:https://regex101.com/r/M97FkV/20
此输入:old 20-year-old _old-maid _old- -old old-’’’ 'old' 20-year-old old’ ....old
将成为:young 20-year-old _old-maid _young- -young young-’’’ 'young' 20-year-old young’ ....young
(?:^|\s)
匹配字符串的开头或空格字符。
[-_,'’.]*
匹配字符类(列表)中的零个或多个字符
\K
重新启动全字符串匹配。这样做是为了避免使用捕获组,更重要的是使用php不允许的“可变宽度后视”。
old
是正在搜索的文字字符串。您可以在此位置应用变量。
(?=[-_,'’.]*(?:\s|$))
是一个由两部分组成的前瞻性表达式。它匹配字符类(列表)中的零个或多个字符,然后需要一个空格字符或字符串的结尾。
完成所有这些卷积以匹配具有可选的前导和/或尾随标点符号的目标子字符串,但超出该非空白字符。