【问题标题】:Java: Regex: +Quantifier not workingJava:正则表达式:+量词不起作用
【发布时间】:2026-02-14 19:20:04
【问题描述】:

所以"XXXXX**".matches("[X{9,11}\\*{2,3}]") 按预期返回false... 但是,"XXXXX**".matches("[X{9,11}\\*{2,3}]+") 返回true。我是否正确使用了+ 量词? (我希望第二个也返回false

【问题讨论】:

  • 大多数符号在方括号中失去意义
  • 值得注意的例外是]-,有时还有^,但绝对不是+
  • [ ] 是一个字符类,匹配括号中列出的任何一个字符。重复项被忽略。所以,[X{9,11}\*{2,3}][,{}\*1239X] 相同,即匹配逗号、左大括号、右大括号、星号、1、2、3、9 或 X。你认为 [ ] 会做什么?
  • 如果您没有字符类,X{9,11}\*{2,3} 将匹配 9 到 11 个 X,然后是 2 或 3 个星。如果你想重复那个分组,你首先用(?: )包装使它成为一个非捕获组,然后添加+,即(?:X{9,11}\*{2,3})+

标签: java regex


【解决方案1】:

[...] 匹配字符类中定义的任何字符,所以 [X{9,11}\\*{2,3}] 实际上是指单个字符,即:X,或左大括号,或 9,或逗号,或 1,或 1(是的,您有重复),或反斜杠或星号....

因此,由于您的字符串中要匹配的字符串中有多个字符,因此这种模式将不匹配。

当你添加一个+时,它意味着匹配一个带有1个或多个[X或星号或....]的字符串,所以它匹配

我相信你真正想做的是使用一个组。

所以正则表达式看起来像(X{9,11}\*{2,3}])+

【讨论】:

  • 哦,额头撞在桌子上,我不敢相信我没听懂:( Muchos 谢谢!
【解决方案2】:
"XXXXXXXXX**".matches("(X{9,11}\\*{2,3})+")
"XXXXXXXX**".matches("(X{9,11}\\*{2,3})+")

匹配真假。

(Xes 和 *s) 的全部内容必须至少出现一次 (+)。

不涉及字符组,无需使用'[]'。

【讨论】: