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

Joh*_*ley 2 java regex regexbuddy

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

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

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

\w* *\(*\)*&*\.*
Run Code Online (Sandbox Code Playgroud)

然后我使用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
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 我必须承认,在正则表达式方面我有点盲点.任何人都可以解释为什么它不起作用吗?

Ill*_*ril 13

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

你想要的是......

test.matches("[\\w \\(\\)&\\.]*")
Run Code Online (Sandbox Code Playgroud)

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

test.matches("[\\w \\(\\)&\\.]+")
Run Code Online (Sandbox Code Playgroud)

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

test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*")
Run Code Online (Sandbox Code Playgroud)

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

  • 好,但你应该提一下,这允许空字符串,这可能不是他的意图. (5认同)