【问题标题】:Java Regex: Matching a string with multiple sets of bracketsJava Regex:将字符串与多组括号匹配
【发布时间】:2012-04-12 21:23:03
【问题描述】:

我试图弄清楚如何编写一个匹配 4 组包含任意数量非括号字符的括号的正则表达式。

例如,这些应该是匹配的。

[hello][world][foo][bar]
[][][][]

这些不应该:

[a][b][c]
[a][b][c][d]e
[[a]][b][c][d]

如果我没记错的话,这(下)似乎与一组括号和其中的字符匹配。

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

我认为我可以通过执行以下操作将其扩展到 4 组,但它不起作用。

[\\[[^\\[\\]]*\\]]{4}

我在这里缺少什么?提前感谢您的帮助。我很感激。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    试试这个:

    Pattern p = Pattern.compile("^(\\[[^\\[\\]]*\\]){4}$");
    

    为您分解:

    "^(\\[[^\\[\\]]*\\]){4}$"
     ││├─┘├───────┘│├─┘ │  └─ the end of the line.
     │││  │        ││   └─ repeat the capturing group four times.
     │││  │        │└─ a literal "]"
     │││  │        └─ the previous character class zero or more times.
     │││  └─ a character class containing anything but the literals "[" and "]"
     ││└─ a literal "[".
     │└─ start a capturing group.
     └─ the beginning of the string.
    

    【讨论】:

    • 感谢您的详细回复。我对何时使用方括号或圆括号感到困惑。 "[^\\[\\]]*" = 零个或多个非括号字符,但 "(abc){4}" = abc 四次。什么时候应该使用一个而不是另一个?
    • @Dazarath:重复/量词运算符(?+*{n,m})作用于前一个token,并捕获组@ 987654327@ 和字符类[...] 都恰好是令牌。事实上,通常使用捕获组(或-捕获组(?:...))正是因为它从序列中创建了一个标记。所以如果你想多次匹配单词“foo”你不能说foo*,因为之前的标记是o,所以你需要说(foo)*
    【解决方案2】:

    你需要对你想要重复的块进行分组,否则它只会匹配重复最后一个] 4次的东西:

    (\\[[^\\[\\]]*\\]){4}
    

    正如 James 在下面指出的那样,您似乎试图使用 [] 进行分组,而不是 ()。这很可能是您出现错误的地方。

    【讨论】:

    • 你实际上需要去掉那些额外的外括号。
    • 哎呀,复制/粘贴失败。固定。
    猜你喜欢
    • 2011-01-30
    • 2020-11-13
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多