匹配 ":)" 表情符后面紧跟单词边界的内容。

6

我正在尝试匹配跟随单词边界\b的表情符号。

比如说,我想匹配后面跟着\b:p:)

/(:p)\b/可以正常工作,但为什么/(:\))\b/的行为相反呢?


2
你需要了解什么是单词边界。它是\w字符类中的一个字符和\W字符类中的一个字符之间的限制,或者是字符串的开头或结尾的限制。 - Casimir et Hippolyte
2
p 是一个单词,) 不是。 - Maroun
你想匹配 :)) 或者 :)% 或类似的东西吗? - JimmyB
顺便问一下,你能告诉我们这是什么编程语言吗? - Wiktor Stribiżew
JavaScript,我会编辑我的问题。 - httpete
2个回答

7

这里不能使用单词边界(word boundary) ,因为)是一个非单词字符。

简而言之:\b可以让你在正则表达式中以\bword\b的形式执行全词匹配搜索。单词字符是指用于构成单词的字符。所有不是单词字符的字符都是非单词字符

使用(:\))来匹配:)并捕获在第一个捕获组中。

使用/(:\))(?![a-z0-9_])/i来避免匹配每个笑脸后跟有字母的情况,它相当于(:\))\B

\B\b的否定版本。 \B\b不匹配的任何位置都会匹配。 实际上,\B在两个非单词字符之间的任何位置和任何两个单词字符之间的位置都会匹配。

请参见演示1演示2


/(:\))/ 匹配的是 ":)p",但我不想匹配这个。那么应该怎么做呢? - httpete
实际上/(:\))\B/正按照我想要的方式运作,你怎么解释这个? - httpete
但是,如果您不想匹配类似于“:),”或“:);”的字符串,则会失败。 - karthik manchala
@CasimiretHippolyte:使用“/[a-z0-9_]/i的等价形式”是否更好? - Wiktor Stribiżew
请注意,在 Unicode 上下文中,\w 等同于 [\p{L}\p{N}_],而且当正则表达式引擎使用不同的语言环境编译时,\w 可能会有所不同。因此,当可用前瞻时,: \)(?!\w) <=> :\)\B 更加防水。 - Casimir et Hippolyte
显示剩余4条评论

4
除了stribizhev的回答之外,您还可以使用(:\))\B 何时使用哪个示例: \b:字符串=That man is batman. 正则表达式=\bman\b 仅匹配man而不是batman中的man,因为tm之间的位置不是单词边界(它是一个单词)。 \B:字符串=I am bat-man and he is super-man.正则表达式=\B-\B匹配super-man中的-,而\b-\b匹配bat-man中的-,因为t--m之间的位置是单词边界,而(空格)- -(空格)不是。
注意:如果您将\b\B视为两个字符之间的位置,并且从字符到字符的转换是单词到单词单词到非单词,那么这很容易理解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接