我遇到了无法使用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"
感谢您的帮助。
答案 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
}