简单的java模式匹配问题?

时间:2018-01-10 20:02:17

标签: java regex

我想测试一个字符串是否包含insertname,以及任何中间字符。如果确实如此,我想打印比赛。

对于以下代码,只有第三个Pattern匹配,并且打印整行。我怎样才能匹配insert...name

    String x = "aaa insert into name sdfdf";
    Matcher matcher = Pattern.compile("insert.*name").matcher(x);
    if (matcher.matches()) 
        System.out.print(matcher.group(0));  
    matcher = Pattern.compile(".*insert.*name").matcher(x);
    if (matcher.matches()) 
        System.out.print(matcher.group(0));  
    matcher = Pattern.compile(".*insert.*name.*").matcher(x);
    if (matcher.matches()) 
        System.out.print(matcher.group(0));  

3 个答案:

答案 0 :(得分:1)

尝试使用此类.*(insert.*name).*

这样的群组
Matcher matcher = Pattern.compile(".*(insert.*name).*").matcher(x);
if (matcher.matches()) {
    System.out.print(matcher.group(1));
    //-----------------------------^
}

或者你可以使用:

x = x.replaceAll(".*(insert.*name).*", "$1");

他们都打印:

insert into name

答案 1 :(得分:1)

您只需在代码中使用find()代替matches()

String x = "aaa insert into name sdfdf";
Matcher matcher = Pattern.compile("insert.*?name").matcher(x);
if (matcher.find()) 
    System.out.print(matcher.group(0));

matches()希望您匹配整个输入字符串,而find()可让您在输入中的任何位置匹配正则表达式。

还建议您使用.*?代替.*,以防您的输入可能包含index ... name对的多个实例。

此代码示例将输出:

insert into name

答案 2 :(得分:0)

只需使用多个正向前瞻:

(?=.*insert)(?=.*name).+

请参阅a demo on regex101.com