具有多个匹配项和非单词字符的全单词搜索

  • 本文关键字:单词 字符 搜索 regex pcre
  • 更新时间 :
  • 英文 :


我正在尝试在一个字符串中匹配整个单词的所有实例以及leetspeak alternatives。例如,让我们采用这个字符串:

brΦwn 8rown The quiçκ brΦwη fox βrown b®øwΠ brownie

我试图捕获 5 个"棕色"实例,但不是"布朗尼"。我有以下正则表达式来匹配它:

/b(b|b.|b_|b-|8||3|ß|Β|β)(r|r.|r_|r-|®)(o|o.|o_|o-|0|Ο|ο|Φ|¤|°|ø)(w|w.|w_|w-|ω|ψ|Ψ)(n|n.|n_|n-|η|Ν|Π)b/i

问题似乎是b匹配第一个非单词字符,并且因为像Π这样的字符是非单词字符,所以匹配而不是之后的空格。使用s定位空白不适用于连续单词(它只匹配"快速棕色棕色狐狸"中的第一个"棕色"(。

关于如何做到这一点的任何建议?

正则表达式 101 设置:https://regex101.com/r/LKo9Xf/4

这能解决问题吗?

[b|b.|b_|b-|8||3|ß|Β|β][[r|r.|r_|r-|®][o|o.|o_|o-|0|Ο|ο|Φ|¤|°|ø][w|w.|w_|w-|ω|ψ|Ψ][n|n.|n_|n-|η|Ν|Π](?= )

演示

您需要为不同的 leetspeak 变体使用字符类。这将导致每个单词的单个匹配项。同样,我没有使用b而是在每个单词的末尾使用负面的前瞻空格。

也许,我们可以使用两个环视而不是单词边界,例如:

(?<!S) and (?!S) are functionally better whitespace boundary's, and much quicker.

由 sln 或:

(?<=^|s)(b|b.|b_|b-|8||3|ß|Β|β)(r|r.|r_|r-|®)(o|o.|o_|o-|0|Ο|ο|Φ|¤|°|ø)(w|w.|w_|w-|ω|ψ|Ψ)(n|n.|n_|n-|η|Ν|Π)(?=s|$)

演示

相关内容

  • 没有找到相关文章

最新更新