检查 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)
这个问题真正简单的解决方案是计算括号,尝试用正则表达式解决它很难,尽管扩展的正则表达式可以处理它。这是简单算法的草图:
- 将
openParenthesisCount
设置为 0
- 遍历字符串:
- 如果当前字符是
(
递增openParenthesisCount
- 如果当前字符
)
递减 openParenthesisCount
,如果计数变为负数则失败(太多关闭)
- 如果当前字符是
:
向前看,如果是括号则跳过下一个字符(跳过表情符号)
- 如果
openParenthesisCount
为零 => 成功
HTH
我需要检查匹配的括号是否存在于可能有表情符号的字符串中(如 :)
或 :(
)。例如,"(:)())()"
、"(abcd)()ghijk)((mnop)qert)"
我已经使用模式 "^[:\(|:\)]"
检查表情符号并使用 "\([^()]*\)"
检查是否存在匹配的括号,但未检测到它们。我该怎么做?
据我所知,当且仅当字符串包含匹配的括号时,您希望在忽略字符串中每次出现的“:)”和“:(”(如果有的话)后匹配该字符串。
所以,试试这个:
^((?!:).)*\(.*(?<!:)\).*
它将匹配以下字符串:
- ()
- (abd)
- (())(
- (:))
- (:(:))
- (:)())()
- (abcd)(ghijk)((mnop)qert)
- (abc):
- (:abc)
但不会匹配以下内容:
- )(
- (:)
- (:(
- :(:)
- :()
- (:)
- :()(:)
- (
- )
- (abc
- abc)
- (abc:)
- :(abc)
这个问题真正简单的解决方案是计算括号,尝试用正则表达式解决它很难,尽管扩展的正则表达式可以处理它。这是简单算法的草图:
- 将
openParenthesisCount
设置为 0 - 遍历字符串:
- 如果当前字符是
(
递增openParenthesisCount
- 如果当前字符
)
递减openParenthesisCount
,如果计数变为负数则失败(太多关闭) - 如果当前字符是
:
向前看,如果是括号则跳过下一个字符(跳过表情符号)
- 如果当前字符是
- 如果
openParenthesisCount
为零 => 成功
HTH