2009-04-22 171 views
2

我需要创建一个正则表达式,其允许一个字符串,以包含任意数量的:为什么这个Java正则表达式不起作用?

  • 字母数字字符
  • 空间
  • &

不允许其他字符。我以前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 
    } 
} 
  • 我必须承认,我有一点盲点的,当涉及到正则表达式。任何人都可以解释为什么它不起作用吗?

回答

13

正则表达式测试任意数量的空白,然后是任意数量的字母数字字符,然后是任何数量的开放式零件,然后是任何数量的紧密零件,紧接着是任意数量的&符号,然后是任意数量的周期。

你想要的是什么......

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

正如mmyers提到的,这使得空字符串。如果你不希望允许空字符串...

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

虽然这也将允许一个字符串,它是唯一的空间,或者仅仅时期,等等。如果你想确保至少一个字母数字字符...

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

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

+5

好,但你应该提到,这允许空字符串,这可能不是他的意图。 – 2009-04-22 16:06:15

+0

没关系,只有当字符串不为空时才会进行正则表达式测试。 – 2009-04-22 16:17:49

+1

好吧,我扩大了答案,包括一些其他的选择,并解释它如何运作一点。 – Illandril 2009-04-22 16:18:54

4

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

2

正则表达式

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

会给你你所描述的项目,但仅在为了你所描述的,并且每一个可以像想尽可能多。所以“skjhsklasdkjgsh((((()))))& & & & & .....”作品,但不混合字符。

你想这样的正则表达式:

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

这将允许所有字符的混合。

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

4

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

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

相关问题