【问题标题】:Why doesn't this Java regular expression work?为什么这个 Java 正则表达式不起作用?
【发布时间】:2010-10-21 03:35:06
【问题描述】:

我需要创建一个允许字符串包含任意数量的正则表达式:

  • 字母数字字符
  • 空格
  • (
  • )
  • &
  • .

不允许使用其他字符。我使用RegexBuddy 构造了以下正则表达式,当我在 RegexBuddy 中对其进行测试时,它可以正常工作:

\w* *\(*\)*&*\.*

然后我使用 RegexBuddy 的“使用”功能将其转换为 Java 代码,但使用简单的测试程序似乎无法正常工作:

public class RegexTest
{
  public static void main(String[] args)
  {
    String test = "(AT) & (T)."; // Should be valid
    System.out.println("Test string matches: "
      + test.matches("\\w* *\\(*\\)*&*\\.*")); // Outputs false
  }
}
  • 我必须承认,在正则表达式方面我有点盲点。谁能解释一下为什么它不起作用?

【问题讨论】:

    标签: java regex regexbuddy


    【解决方案1】:

    该正则表达式测试任意数量的空格,后跟任意数量的字母数字字符,后跟任意数量的左括号,后跟任意数量的右括号,后跟任意数量的 & 符号,然后是任意数量的句点.

    你想要的是……

    test.matches("[\\w \\(\\)&\\.]*")
    

    正如 mmyers 所提到的,这允许空字符串。如果您不想允许空字符串...

    test.matches("[\\w \\(\\)&\\.]+")
    

    虽然这也将允许一个只有空格或只有句点等的字符串。如果你想确保至少有一个字母数字字符......

    test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*")
    

    所以你明白正则表达式在说什么......方括号(“[]”)中的任何内容都表示一组字符。所以,“a*”表示0个或多个a,[abc]*表示0个或多个字符,都是a、b或c。

    【讨论】:

    • 好,但你应该提到这允许空字符串,这可能不是他的意图。
    • 没关系,只有字符串不为空才会进入正则测试。
    • 好吧,我还是扩展了答案以包括其他一些替代方案,并稍微解释一下它是如何工作的。
    【解决方案2】:

    也许我误解了你的描述,但你本质上不是定义了一类没有顺序而不是特定序列的字符吗?您的正则表达式不应该具有 [xxxx]+ 的结构,其中 xxxx 是您想要的实际字符吗?

    【讨论】:

      【解决方案3】:

      Java 代码 sn-p 和 RegexBuddy 中的 Test 选项卡之间的区别在于 Java 中的 matches() 方法需要正则表达式来匹配整个字符串,而 RegexBuddy 中的 Test 选项卡允许部分匹配。如果您在 RegexBuddy 中使用原始正则表达式,您将看到多个黄色和蓝色突出显示的块。这表明 RegexBuddy 在您的字符串中发现了多个部分匹配项。要获得与 match() 一起使用的正则表达式,您需要对其进行编辑,直到整个测试主题以黄色突出显示,或者如果您关闭突出显示,直到 Find First 按钮选择整个文本。

      或者,您可以在正则表达式的开头和结尾使用锚点 \A 和 \Z 来强制它匹配整个字符串。当你这样做时,你的正则表达式总是以相同的方式运行,无论你是在 RegexBuddy 中测试它,还是在 Java 中使用matches() 或其他方法。只有matches() 需要完整的字符串匹配。 Java 中的所有其他 Matcher 方法都允许部分匹配。

      【讨论】:

        【解决方案4】:

        正则表达式

        \w* *\(*\)*&*\.*
        

        会给你你描述的项目,但只能按照你描述的顺序,每个都可以随心所欲。所以 "skjhsklasdkjgsh((((())))))&&&&&....." 有效,但不能混合字符。

        你想要这样的正则表达式:

        \[\w\(\)\&\.]+\
        

        这将允许混合所有字符。

        edit:我的正则表达式知识有限,所以上面的语法可能并不完美。

        【讨论】:

        • 转义方括号是不对的。在方括号内,括号、& 符号或点不需要转义:"[\w()&.]"
        • 方括号不会被转义,正则表达式包含在反斜杠中。除此之外,感谢您的信息。我不确定什么需要转义,什么不需要,所以谢谢。
        • 为什么会有人想要在反斜杠中包含正则表达式?正则表达式中的任何内容都不需要转义。
        • 您可能会想到 forward 斜杠,这是具有正则表达式文字的语言中的传统正则表达式分隔符。例如,在 JavaScript 中,您的正则表达式将是 /[\w ()&.]+/。但是在 Java 中,正则表达式只是字符串,所以你必须把它写成 "[\\w ()&.]+"。
        • 至少每天都是在 stackoverflow 的学习经历 :)。就像我说的我只是想帮忙,但我确实意识到我的正则表达式知识是有限的。感谢您解决这些问题。
        猜你喜欢
        • 2013-12-05
        • 1970-01-01
        • 2013-05-18
        相关资源
        最近更新 更多