【问题标题】:PCRE Regexp - Match just for one pair of square bracketsPCRE Regexp - 仅匹配一对方括号
【发布时间】:2020-02-04 12:21:51
【问题描述】:

仅当有一对使用 PCRE 正则表达式引擎的方括号时才匹配。尝试了.+\[[^\[\]]*\],但仍然匹配array[[]

更好理解的示例:

array[]
array[1]
array[associative]


不好

array[[]
array[]]
array[[]]
array[[1]
array[onther array[1]]

【问题讨论】:

  • ][ 应该是坏的吗?
  • the answer 为你工作了吗?

标签: regex pcre


【解决方案1】:

如果您希望 [] 不匹配,则不能使用 .

不清楚你到底想要什么,但你的问题的字面答案是

\[[^][]*\]

匹配文字左方括号\[,匹配任何不是][ 的字符的字符类,重复零次或多次,以及文字右方括号\]

字符类[^][] 看起来有点令人难以置信,直到您意识到在否定字符类中的字符枚举中] 必须位于[ 之前。

一些正则表达式工具也允许 \] 在字符类中,但这不是通用的或可移植的。在其他一些情况下,它意味着文字反斜杠和字符类的结尾。

【讨论】:

    【解决方案2】:

    模式匹配array[[],因为.+\[首先匹配任何字符(包括第一个[直到行尾,然后回溯直到最后出现[,其中然后模式的其余部分将匹配,直到第一次关闭]

    如果在同一行上只能有一个左方括号后跟一个右方括号,则可以使用归类为 [^[\]\r\n] 的否定字符匹配除所列字符之外的任何字符:

    ^[^[\]\r\n]+\[[^[\]\r\n]*]$
    

    Regex demo

    或者如果没有锚,您可以使用负前瞻 (?![[\]]) 来确保后面没有方括号

    [^[\]\r\n]+\[[^[\]\r\n]*\](?![[\]])
    

    Regex demo

    请注意,此模式适用于当前示例数据,但也适用于许多失败的边缘情况。

    【讨论】:

      【解决方案3】:

      一个正则表达式匹配一个只有一对[...]使用的字符串

      ^[^][]*\[[^][]*][^][]*$
      

      regex demo

      详情

      • ^ - 字符串开头
      • [^][]* - 除了 [] 之外还有 0+ 个字符
      • \[ - [
      • [^][]* - 除了 [] 之外的 0+ 个字符
      • ] - 一个 ] 字符
      • [^][]* - 除了 [] 之外还有 0+ 个字符
      • $ - 字符串结束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2012-02-11
        • 1970-01-01
        相关资源
        最近更新 更多