java - 如何获取两个特定字符串之间的文本

标签 java regex string

我想获取文本和特定字符串,直到它与另一个字符串匹配。我有 》门数: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 与单词字符不匹配,因此我稍微调整了模式。

Java demo :

 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/

相关文章:

regex - Perl正则表达式匹配来自磁力链接的infohash

string - Prolog 中的字符串排序

java - 多线程访问synchronizedList

java - 在运行时更新 JAR

javascript - 正则表达式查找所有出现的字符串然后找到它之后的下一个空格

java - 如何修复我的正则表达式,使参数 3 保留在捕获组 3 中?

java - 在 onpause 中释放可绘制的背景

java - 每个单元的自定义单元工厂 JavaFX

c++ - 将字符串转换为 time_t,然后将 time_t 转换回字符串

arrays - bash 字符串到带有空格和额外分隔符的数组