为什么这个Java正则表达式不起作用?

时间:2009-04-22 16:00:11

标签: java regex regexbuddy

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

  • 字母数字字符
  • 空间
  • &安培;

不允许使用其他字符。我使用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
  }
}
  • 我必须承认,在正则表达方面,我有一点盲点。谁能解释为什么它不起作用?

4 个答案:

答案 0 :(得分:13)

正则表达式测试任何数量的空格,后跟任意数量的字母数字字符,然后是任意数量的空白数据,接着是任意数量的密切数据,然后是任意数量的&符号,然后是任意数量的句点

你想要的是......

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

正如mmyers所说,这允许空字符串。如果你不想允许空字符串......

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

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

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

所以你理解正则表达式的含义......方括号内的任何内容(“[]”)表示一组字符。因此,“a *”表示0或更多a,[abc] *表示0或更多字符,所有字符都是a,b或c。

答案 1 :(得分:4)

也许我误解了你的描述,但是你实际上不是在没有命令而不是特定序列的情况下定义一类字符吗?你的regexp不应该有[xxxx] +的结构,其中xxxx是你想要的实际字符吗?

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

正则表达式

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

会为您提供您描述的项目,但仅按照您描述的顺序,每个项目可以按照您想要的数量。所以“skjhsklasdkjgsh(((((())))))&&&&& .....”可以工作,但不能混合人物。

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

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

允许混合所有字符。

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