Java Pattern这些模式匹配有什么问题?

时间:2017-02-26 04:46:20

标签: java regex

我想要一个java模式匹配一​​系列非空格字符,后跟或不是一系列空白字符,后跟一对包含此代码的括号内的括号:

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

但是,当我尝试将它与" a(a)"匹配时,会返回false。

也许类似的问题:

两个以白色空间为主的网站:

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+]");

2 个答案:

答案 0 :(得分: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());

打印为真。

答案 1 :(得分:0)

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

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

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

虽然这会成功说a (b),但如果您在同一个句子中有两个匹配项并且通常只是一个混乱的表达式,则会产生意外结果。

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

在学习基础知识之后,一个特殊的资源是http://regex101.com等网站提供的实时测试环境,包括语法突出显示,匹配突出显示,匹配细分以及令牌鼠标悬停的工具提示,这是一个很好的方式采取第二步。虽然它只支持一些(常用的)风格,但大多数成熟的编程/脚本语言在正则表达式中共享相同的基本/中间功能。