如何获得两个特定字符串之间的文本

问题描述:

我想获取文本和特定字符串,直到它匹配另一个字符串。我有 “门数:5 这个门后面唧唧歪歪...如何获得两个特定字符串之间的文本

门数:6 这个门后面唧唧歪歪” 我需要得到“门数:5 这门喇嘛喇嘛的背后喇嘛......”

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)); 
     } 

这是我的代码,但是当我运行它。我需要门51 text1的我只得到文本1,门61文本2,门10文字3。

+1

为什么不直接劈在'Door',那么第一个空格后生成的字符串分割字符串?将第一部分转换为int。这样,你最终会得到类似'[[61,“text2”],[10,“text3”]]''的东西。不需要正则表达式。 – domsson

你需要使用一个超前而不是消费模式(.*?)之后的比赛变成重叠:

\bDoor\s+\d+(.*?)(?=\bDoor\s+\d+|$) 
       ^^^^^^^^^^^^^^^^^^ 

regex demo

(?=\bDoor\s+\d+|$)的先行将需要串$Door的端部(作为一个整体的字),1 +空白字符(\s+)和比换行符字符(.*?)以外的任何字符0+后1+位数(\d+)。请注意,r\b\s中的单词边界是没有意义的,因为\s与单词char不匹配,所以我调整了一下该模式。

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 solutionsplit

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] 
+1

谢谢。第一个解决方案的工作,我只是用group()而不是group(1)。 – user771

+0

所以,你需要保持'门...'?然后你可以使用第二种方法 - 'String [] doors = str.split(“(?= \\ bDoor \\ s + \\ d +)”);'。请参阅[** IDEONE演示**](https://ideone.com/R0Npvk)。 –