2

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

例如,这些应该匹配。

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

这些不应该:

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

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

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

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

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

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

4

2 回答 2

8

尝试这个:

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.
于 2012-04-12T21:26:40.750 回答
4

您需要对要重复的块进行分组,否则它将仅匹配最后重复]4 次的内容:

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

正如詹姆斯在下面指出的那样,看起来您正在尝试[]用于分组,而不是(). 这很可能是您的错误出现的地方。

于 2012-04-12T21:26:32.910 回答