我想获取文本和特定字符串,直到它与另一个字符串匹配。我有 “门号: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。我需要Door 51 text1,Door 61 text2,Door 10 text3。
答案 0 :(得分:3)
由于匹配结果重叠,您需要在(.*?)
之后使用前瞻而不是消费模式:
\bDoor\s+\d+(.*?)(?=\bDoor\s+\d+|$)
^^^^^^^^^^^^^^^^^^
请参阅regex demo。
(?=\bDoor\s+\d+|$)
预测将需要字符串$
或Door
(作为整个单词),1 +空格(\s+
)和1+位数({ {1}})除了换行符(\d+
)之外的任何0+字符之后。请注意.*?
中的单词边界没有意义,因为r\b\s
与单词char不匹配,所以我稍微调整了模式。
\s
alternative solution 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));
}
:
split