与破折号的确切词冲突词

时间:2017-11-11 05:22:15

标签: php regex

最初,我使用的只是单词边界来进行精确的单词匹配 - https://regex101.com/r/M97FkV/4

更新1

1)与20-year-old

之类的单词内的标点符号完全匹配
  • 搜索year's,只有year's完全匹配

- 单独搜索year,与year's

不匹配
  • 如果我搜索20-year-old,则确切20-year-old匹配

- 搜索20yearold20-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)

1 个答案:

答案 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|$))是一个由两部分组成的前瞻性表达式。它匹配字符类(列表)中的零个或多个字符,然后需要一个空格字符或字符串的结尾。

完成所有这些卷积以匹配具有可选的前导和/或尾随标点符号的目标子字符串,但超出该非空白字符。