【问题标题】:Regex NOT [^ ... ] expression not working on complex expression [duplicate]正则表达式 NOT [^ ... ] 表达式不适用于复杂表达式 [重复]
【发布时间】:2020-06-04 13:46:28
【问题描述】:

我有匹配任何表情符号的正则表达式(取自here):

val EMOJI_REGEX = "(?:[\u2700-\u27bf]|(?:[\ud83c\udde6-\ud83c\uddff]){2}|[\ud800\udc00-\uDBFF\uDFFF]|[\u2600-\u26FF])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|[\ud83c\udffb-\ud83c\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:[\ud83c\udde6-\ud83c\uddff]){2}|[\ud800\udc00-\uDBFF\uDFFF]|[\u2600-\u26FF])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|[\ud83c\udffb-\ud83c\udfff])?)*|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|[\ud83c\udd70-\ud83c\udd71]|[\ud83c\udd7e-\ud83c\udd7f]|\ud83c\udd8e|[\ud83c\udd91-\ud83c\udd9a]|[\ud83c\udde6-\ud83c\uddff]|[\ud83c\ude01-\ud83c\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ud83c\ude3a]|[\ud83c\ude50-\ud83c\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff]".toRegex()

如果我尝试将它与 Emojis 匹配,它会完美运行:

"????‍????‍????".contains(EMOJI_REGEX)    ==> true ( as expected )
".".contains(EMOJI_REGEX)    ==> false ( as expected )
"yady".contains(EMOJI_REGEX)    ==> false ( as expected )

但是,如果我想否定正则表达式:在整个表达式之前添加[^ ...]

val NEGATED_EMOJI_REGEX = "[^(?:[\u2700-\u27bf]|(?:[\ud83c\udde6-\ud83c\uddff]){2}|[\ud800\udc00-\uDBFF\uDFFF]|[\u2600-\u26FF])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|[\ud83c\udffb-\ud83c\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:[\ud83c\udde6-\ud83c\uddff]){2}|[\ud800\udc00-\uDBFF\uDFFF]|[\u2600-\u26FF])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|[\ud83c\udffb-\ud83c\udfff])?)*|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|[\ud83c\udd70-\ud83c\udd71]|[\ud83c\udd7e-\ud83c\udd7f]|\ud83c\udd8e|[\ud83c\udd91-\ud83c\udd9a]|[\ud83c\udde6-\ud83c\uddff]|[\ud83c\ude01-\ud83c\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ud83c\ude3a]|[\ud83c\ude50-\ud83c\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff]]".toRegex()

,它不会按预期工作。它将始终返回 false,而对于表情符号,它应该返回 false,对于任何其他字符,它应该返回 true

"????‍????‍????".contains(NEGATED_EMOJI_REGEX)    ==> false ( correct )
    ".".contains(NEGATED_EMOJI_REGEX)    ==> false ( wrong )
    "yady".contains(NEGATED_EMOJI_REGEX)    ==> false ( wrong )

如果我想否定一个基本表达式,例如:[^a-zA-z],它就可以了。

任何想法可能是什么问题?

【问题讨论】:

  • [^.....] 不否定表达式,它匹配所有不在字符类中的字符。

标签: android regex kotlin regex-negation


【解决方案1】:

[] 中的任何内容都被视为字符,而不是表达式。

而对于表情符号它应该返回 false,而对于任何其他表情它应该返回 true 字符。

这可以通过匹配唯一的非Unicode字符来完成

[^\u0000-\u007F]+

整个正则表达式不能被否定可以尝试否定前瞻?!

 ^(?!(?:[\u2700-\u27bf]...[\u2190-\u21ff])

或者简单地使用否定,你的初始结果值为!resultOfRegexMatch

【讨论】:

  • 是的。这是工作。很棒的答案。负前瞻按预期工作。
猜你喜欢
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2015-02-21
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多