我正在尝试在一个字符串中匹配整个单词的所有实例以及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|$)