Java Regex表达式不起作用

时间:2017-10-21 21:22:49

标签: java regex

我遇到了无法使用REGEX的问题。我不知道我做错了什么。我的代码:

String test = "timetable:xxxxxtimetable:;   timetable: fullihhghtO;";
Pattern p = Pattern.compile("\\btimetable:(.*);");
//also tried "timetable:(.*);" and "(\\btimetable:)(.*)(;)"
Matcher m = p.matcher(test);

while(m.find()) {
    System.out.println("S:" + m.start() + ", E:" + m.end());
    System.out.println("x: "+ test.substring(m.start(), m.end()));
}

预期结果:

(1) "timetable:xxxxxtimetable:"
(2) "timetable: fullihhghtO"

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在我们的案例中,非捕获组可能很方便:

    String test = "timetable:xxxxxtimetable:;   timetable: fullihhghtO;";
    Pattern p = Pattern.compile("(?:\\btimetable:(.*?);)+"); // <-- here
    Matcher m = p.matcher(test);

    int i = 1;
    while (m.find()) {
        System.out.println(i + ") "+ m.group(1));
        i++;
    }

<强>输出

1) xxxxxtimetable:
2)  fullihhghtO

正则表达式解释说:
(?:\\btimetable:(.*?);)+使用非捕获(?:\\btimetable:...)我们将使用“时间表:”而不捕获它,然后第二个匹配组(.*?)捕获我们想要捕获的内容(\btimetable:之间的所有内容1}}和;)。特别注意非贪婪的术语:.*?这意味着我们将消耗尽可能少的字符,直到;。如果我们不使用这种惰性形式,正则表达式将使用“贪婪”默认模式,并将消耗所有字符,直到字符串中的最后一个;

现在,如果你只想捕捉到独特的部分,那么所有这些都是相关的,但如果你想抓住整个事情:

1) timetable:xxxxxtimetable:;
2) timetable: fullihhghtO;

可以通过将正则表达式修改为:

来轻松完成
Pattern p = Pattern.compile("\\b(timetable:.*?;)+");

甚至更简单:只有一个捕获组(请参阅我们仍然必须使用非贪婪模式!)。

答案 1 :(得分:0)

您不需要使用正则表达式,只需进行简单拆分即可:

public static void main(String[] args) throws IOException {
    String test = "timetable:xxxxxtimetable:;   timetable: fullihhghtO;";
    String[] array = test.split(";");
    String str1 = array[0].trim();
    String str2 = array[1].trim();

    System.out.println(str1 + "\n" + str2);      //timetable:xxxxxtimetable:
                                                 //timetable: fullihhghtO
}