【问题标题】:Regex for emoticons in text文本中表情符号的正则表达式
【发布时间】:2015-02-10 18:25:05
【问题描述】:

我必须在给定文本中查找并替换所有 Facebook 样式的表情符号,但找不到正确的正则表达式来执行此操作。根据经验,它必须匹配用户有意输入的所有表情符号,不匹配可以是地址、数字、运输代码、链接、随机文本 ecc 的一部分的表情符号。 ..

这个(^|\s)(:D|:\/)(\s|\W|$) 不适用于我测试的所有案例(标有"must match""must not match"):

:D "must match" Sample text for testing:
abcdefghijkl:Dm "must not match" nopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 +-:D.,! "must not match" @#$%^&*();\/|<>"' "must match" :/.
12345 :/-98.7 "must not match" 3.141 ://.6180 "must not match" 9,000 +42
555.123.4567    :D+1-(80 "must not match" :D555-2468: "must not match"
foo@demo.net    "must match" bar.ba@test.co.uk :D
:/ "must match" http://"must not match"foo.co.uk/ "must match" :D?
http://regexr.com/foo.html?q=bar
:D
:/
:D
:D
"must all 4 match"

现场测试用例:http://regexr.com/3ad1j

我也试过(^|\s|\B)(:D|:\/)(\s|\B|\b|$),它匹配所有"must match",但也匹配三个"must not match"...

举例来说,这个正则表达式只有两个表情符号,在实际情况下,我有一个包含 50 个表情符号的数组来查找并替换为相应的表情符号。

更新:新的测试用例 http://regexr.com/3ad6i 更新了 (^|\s)(:D|:\/)(?=\s|[^0-9A-Za-z+-]|$) 正则表达式,还有一些 "must not match" 需要消除。

更新 2:用更新的 (^|\s)(:D|:\/)(?=\s|[^"-(*+\-/-&gt;@-~]|$) 正则表达式更新了测试用例 http://regexr.com/3ad6i,效果很好,我可以通过某种方式改进它吗?

【问题讨论】:

  • 更具体地说明您的条件是什么,为什么“:/. 12345 :/-98.7”应该匹配,为什么不应该匹配“nopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 +-:D.,!”匹配你到底在看什么对于
  • 它必须匹配用户有意输入的所有表情符号,而不是可以作为地址、数字、运输代码、链接、随机文本的一部分的表情符号...

标签: regex emoji emoticons


【解决方案1】:

你可以使用这个正则表达式:

(^|\s)(:D|:\/)(?=\s|[^[:alnum:]+-]|$)

Online demo

【讨论】:

  • 我不知道字符类,谢谢。在线演示似乎也不了解 :alnum: 是什么,现在我尝试用 0-9A-Za-z 替换它。你知道 :alnum: 是否在 Objective-C NSRegularExpression 中工作吗?还有没有办法在结果中不包括第一组?
  • @Shebuka 我稍微修改了正则表达式。你是对的,在线演示不识别字符类。我不知道这个正则表达式是否适用于 Objective-C。
  • @Shebuka 您的新正则表达式似乎工作正常。你想改进什么?
  • 这部分: [^"-(*+\-/->@-~] 是否有更优化的方式来表示“不匹配除 ! 之外的所有可打印字符) , . ?” ?
猜你喜欢
  • 2019-05-10
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2016-12-04
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多