2017-02-26 53 views
-1

我想一个Java模式相匹配的一系列非空白字符,接着或由一系列空白字符的否,接着是对含有任何与此代码中括号的:Java模式这些模式匹配有什么问题?

 Pattern p1 = Pattern.compile("[^\\s+][\\s*]\\({1}[.*]\\){1}"); 

然而,当我试图将它与“a(a)”匹配,返回false。

也许类似的问题:

两个网站由空格saparated:

非空白字符标点符号或存在于下面的代码(例如字的某些列表分离的
Pattern p4 = Pattern.compile("([^\\s+]([\\.]{1}[^\\s+])+)[\\s+]([^\\s+]([\\.]{1}[^\\s+])+)"); 

两个字符串,或者又名...)(它可以从单词列表开始)。

Pattern p2 = Pattern.compile(
      "([^\\s+][\\s+])?([and|or|aka|&|Related to|moved from|now|formerly|and by the same host|and any address starting with]{1}[\\s+][^\\s+])+"); 


Pattern p3 = Pattern.compile("[^\\s]+[\\s*][,|&|;|\\s+/|/\\s+]{1}[\\s*][^\\s+]"); 

回答

0

我想读在Java中docs on patterns可能会有所帮助

特别的问题是,你把+*到错误的地方,但我想原因是,你有什么不明白[something]手段。以下代码

Pattern p1 = Pattern.compile("[^\\s]+[\\s]*\\({1}.*\\){1}"); 
    //Pattern p1 = Pattern.compile("[^\\s]+[\\s]*\\(.*\\)"); //simplified same pattern 
    String t = "a (a)"; 
    Matcher matcher = p1.matcher(t); 
    System.out.println(matcher.matches()); 

打印为真。

0

[^\\s]+[\\s]*\\(.*?\\)

会做你想要什么。将括号内的字符类以外的星号和加号移动。 {1}的两个实例都不做任何事情。没有其他量词,令牌重复一次,最后[.*]在这两个字符的字面意思是permit one of these two characters

[test]意思是t,e或s中的一个。第二个t是无关紧要的。字符类中的大多数字符意味着它们的字面意义,但是例外涉及比在S/O答案中应该做更多的解释。

不是说虽然这会成功说a (b),但如果你有两个匹配在同一个句子中并且通常只是一个杂乱的表达式,这将会带来意想不到的结果。

对于一个现实的表达式,您需要提供逼真的样本数据。

一种特殊的资源,学习基础知识后,是像http://regex101.com与语法高亮,搭配高亮,比赛击穿,并提示在令牌鼠标悬停网站提供的实时测试环境,它是采取第二个步骤的好方法。虽然它只支持少数(常用)风格,但大多数成熟的编程/脚本语言在正则表达式中共享相同的基本/中间功能。