如何编写正则匹配括号外的| 分割字符串时忽略括号内的|
问题说明
现有如下几类括号包裹的字符串形式:
(name|address) ([name|address]) [name|address]
需求为查找字符串中的|字符时,忽略所有上述括号内部的|;进一步可扩展为按|分割字符串时,不将括号内部的|作为分割标记。
当前使用的正则为\|(?![^(]*\)),无法覆盖全部场景。
补充测试用例:
- 输入字符串:
|Hello all, | morning [name|address] | - 预期效果:仅匹配括号外的3个
|作为分割点,[name|address]内部的|不做匹配。
可用正则
适配所有上述场景的正则写法如下:
\|(?![^(\[]*[\])])
如果在Java、Python等需要对字符串内反斜杠做转义的语言中使用,写法调整为:
\\|(?![^(\\[]*[\\])])
逻辑说明
- 核心匹配目标是所有不在
()、[]括号内部的| - 负向预查部分
(?![^(\[]*[\])])的作用是:从当前位置的|往后查找,如果在遇到任何开括号(/[之前,先遇到了对应的闭括号)/],说明当前|在括号内部,不做匹配 - 该写法兼容给出的一层括号嵌套场景,只要输入字符串的括号是正确配对的,就能得到符合预期的匹配结果。
测试效果
针对补充测试用例|Hello all, | morning [name|address] |,使用该正则匹配到的|位置共3处,正好是所有括号外的分割点,分割结果为:
[ "", "Hello all, ", " morning [name|address] ", "" ]
内容的提问来源于stack exchange,提问作者xorax12
相关产品推荐
相关产品推荐

