You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则匹配括号外的| 分割字符串时忽略括号内的|

问题说明

现有如下几类括号包裹的字符串形式:

(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:03:43