检查 NSString 中的平衡括号时忽略表情符号

Ignoring emoticons when checking for balanced parentheses in an NSString

我需要检查匹配的括号是否存在于可能有表情符号的字符串中(如 :):()。例如,"(:)())()""(abcd)()ghijk)((mnop)qert)"

我已经使用模式 "^[:\(|:\)]" 检查表情符号并使用 "\([^()]*\)" 检查是否存在匹配的括号,但未检测到它们。我该怎么做?

据我所知,当且仅当字符串包含匹配的括号时,您希望在忽略字符串中每次出现的“:)”和“:(”(如果有的话)后匹配该字符串。

所以,试试这个:

^((?!:).)*\(.*(?<!:)\).*



它将匹配以下字符串:

  • ()
  • (abd)
  • (())(
  • (:))
  • (:(:))
  • (:)())()
  • (abcd)(ghijk)((mnop)qert)
  • (abc):
  • (:abc)

但不会匹配以下内容:

  • )(
  • (:)
  • (:(
  • :(:)
  • :()
  • (:)
  • :()(:)
  • (
  • )
  • (abc
  • abc)
  • (abc:)
  • :(abc)

这个问题真正简单的解决方案是计算括号,尝试用正则表达式解决它很难,尽管扩展的正则表达式可以处理它。这是简单算法的草图:

  1. openParenthesisCount 设置为 0
  2. 遍历字符串:
    1. 如果当前字符是(递增openParenthesisCount
    2. 如果当前字符 ) 递减 openParenthesisCount,如果计数变为负数则失败(太多关闭)
    3. 如果当前字符是 : 向前看,如果是括号则跳过下一个字符(跳过表情符号)
  3. 如果 openParenthesisCount 为零 => 成功

HTH