如何使用正则表达式匹配表情符号?

11

我需要捕捉像这样的笑脸

:)
:P
:-P
=)
:D
;)

等等,还有一些一般文本。这是我的当前正则表达式:

\b[0-9A-Za-z'\&\-\./()=:;]+\b

然而,由于某种原因,它无法匹配()=:;。我有什么遗漏吗?

编辑:根据Mark的反馈,这是我需要解析的一个示例:

hi =as.) friend :) haha yay! ;) =) test test) R&R I.O.U. 24/7
这应该提取出:
hi
friend
:)
haha
yay
;)
=)
test
test
R&R
I.O.U.
24/7

我尝试使用提出的任何解决方案都无法使其正常工作。


你是假设它们总是从左到右书写的吗? - Roman
我曾经是,但那是一个我没有考虑过的有趣观点。 - Wesley Tansey
6
你应该列出所有你想匹配的有效表情符号,并从那里开始描述。否则,你的正则表达式会捕捉到用户输入的几乎所有垃圾字符,比如$#*(&$# - Roman
1
请注意,大多数表情符号将 不会\b 单词边界上开始和/或结束。 一个好的方法是使用环视断言,在表情符号前后要求空格(或字符串结尾)。即 (?<=^|\s)(?:list|of|smilies)(?=$|\s) - ridgerunner
3个回答

5

这是一个例子,它捕获了上面例子后面的一个单词。它将单词和后面的表情符号分别捕获到不同的组中。 Rubular链接

\s(\w+)\s((?::|;|=)(?:-)?(?:\)|D|P))

编辑 根据编辑和给定的示例,这可能是所需的内容。它定义了两个捕获组,一个用于一般文本,另一个用于表情符号。 这里是Rubular链接

([0-9A-Za-z'\&\-\.\/\(\)=:;]+)|((?::|;|=)(?:-)?(?:\)|D|P))

如果一行中有超过两个单词或单词之间有超过一个空格等情况,那么这个似乎就不太稳定。 - Wesley Tansey
@Wesley:随意更改以满足您的需求;)。这个想法是展示如何定义一个表情符号捕获正则表达式。结尾处的组定义了表情符号的正则表达式。它需要:;=中的一个,后跟0或1个-(破折号),后跟1个)DP中的任意一个。 - Mark Wilkins
@马克:我现在明白了,谢谢。唯一的问题是它没有解决第二个需求-也要捕获通用文本。我需要捕获匹配 [0-9A-Za-z'\&\-\.\/]+ 的文本。 - Wesley Tansey
@Mark:谢谢,我添加了一个示例。 - Wesley Tansey
@Wesley:这似乎是一个合理的解决方案。 - Mark Wilkins
显示剩余4条评论

1

我在这里使用Rubular进行了测试。如果我转义/,那么它就可以工作了。(更新:并且删除单词边界。)

[0-9A-Za-z'\&\-\.\/()=:;]+

更新:正斜杠转义是我从rubular得到的错误消息。这里真正的问题是\b锚点。它们匹配单词边界,即从[A-Za-z0-9_]到其他内容的边界。这意味着它不会匹配:-),因为没有单词边界。

1
显然我完全不明白OP在问什么。上面的正则表达式捕获几乎任何东西,无论它是否有表情符号。例如它喜欢ab'c&dD:ef(x&a-b( =6。那是OP所要求的吗? - Mark Wilkins
@Mark,我也不确定,我知道这将匹配很多东西。我的解决方案只是修复他的“错误”,那是我晚上能做的唯一的事情,但你做得更好(+1)。 - stema

0
如果你在字符类前面和后面移除 \b,或者转义 /,那么它就能够正常工作。
我认为移除单词边界的原因是因为它只匹配包含字母数字字符的单词...如果我没记错的话。

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