我想获取文本和特定字符串,直到它与另一个字符串匹配。我有 》门数:5 在这扇门后面 bla bla bla...
门数:6 在这扇门后面 bla bla bla” 我需要获取“门号:5 在这扇门后面 bla bla bla...”
String str = " Door 51 text1 Door 61 text2 Door 10 text3";
Pattern pattern = Pattern.compile("\\s\\bPage\\b\\s\\d+(.*?)\\s\\bPage\\b\\s\\d+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
这是我的代码,但是当我运行它时我只得到text1。我需要门51文本1,门61文本2,门10文本3。
最佳答案
您需要在 (.*?)
之后使用前瞻而不是消费模式,因为匹配结果重叠:
\bDoor\s+\d+(.*?)(?=\bDoor\s+\d+|$)
^^^^^^^^^^^^^^^^^^
请参阅regex demo .
(?=\bDoor\s+\d+|$)
前瞻需要字符串 $
或 Door
结尾(作为整个单词),除了换行符(.*?
)。请注意,r\b\s
中的单词边界没有任何意义,因为 \s
与单词字符不匹配,因此我稍微调整了模式。
String str = " Door 51 text1 Door 61 text2 Door 10 text3";
Pattern pattern = Pattern.compile("\\bDoor\\s+\\d+(.*?)(?=\\bDoor\\s+\\d+|$)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
安alternative solution与分割
:
String str = "Door 51 text1 Door 61 text2 Door 10 text3";
String[] doors = str.replaceFirst("^\\s*\\bDoor\\s+\\d+\\s*", "").split("\\s*\\bDoor\\s+\\d+\\s*");
System.out.println(Arrays.toString(doors));
// = > [text1, text2, text3]
关于java - 如何获取两个特定字符串之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530331/