【问题标题】:Regex match outer nested tags正则表达式匹配外部嵌套标签
【发布时间】:2018-01-06 22:53:54
【问题描述】:

我有这个字符串

blabla [IC="test"]Hello, [IC="testing"] this is a nested tag [EC], cya.[EC] blabla

我正在尝试匹配外部[IC="..."]...[EC],以便我可以得到

[IC="test"]Hello, [IC="testing"] this is a nested tag [EC], cya.[EC]

我现在有这个

\[IC=\"([\s\S]*?)\"]([\s\S]*?)\[EC]\n{0,1}

但直到最后一个结束标签[EC]才匹配它

这是我在regex101上的代码示例

【问题讨论】:

  • 什么语言/风味/引擎?
  • 我不太喜欢 RegEx,但我在使用 objc 的 iOS 应用程序中使用它。
  • 递归模式怎么样? regex101.com/r/rlUHeZ/1

标签: regex


【解决方案1】:

您可以使用递归模式(PCRE 支持):

\[IC[^][]*\]
(?:(?:[^][]*|(?R))*)
\[EC\]

a demo on regex101.com

【讨论】:

  • 谢谢!我稍微修改了代码,使其支持换行符并捕获一些部分。 \[IC="([\s\S]*?)"\]((?:(?:[^][]*|(?R))*))\[EC\]
【解决方案2】:

试试这个:

(\[IC="\w*"\].*\[EC\])

https://regex101.com/r/MVU9ni/1

匹配位于[IC="any_word_character_here"][EC] 之间的0 个或多个字符。

【讨论】:

    【解决方案3】:

    我不明白您是否决定使用\s\S,而且它看起来比实际应该的更令人困惑。 但是,要解决您遇到的问题,只需删除 ?

    ...([\s\S]*?)\[EC]...
    

    ...([\s\S]*)\[EC]...
    

    导致

    \[IC=\"([\s\S]*?)\"]([\s\S]*)\[EC]\n{0,1}
    

    但是我会简单地使用\w.*,因为它们更容易

    \[IC="(\w*)"\](.*)\[EC\]
    

    编辑:

    假设您实际上需要从 [IC=".."] 和中间的字符串中获取字符串值。否则,如果您只需要整个数据,则不需要分组

    \[IC="\w*"\].*\[EC\]
    

    【讨论】:

    • 谢谢!你的答案也有效!我正在使用 \s\S 来支持换行符。
    【解决方案4】:

    下面的正则表达式应该可以解决问题:

    [^\[]*(\[.*\])[^\]]*
    

    您可以访问this link 尝试工作演示。

    或者,如果您不想依赖捕获组,这应该足够了:

    (\[.*\])
    

    上面的正则表达式的工作演示可以测试here

    【讨论】: