2017-03-01 169 views
2

我想獲取文本和特定字符串,直到它匹配另一個字符串。我有 「門數: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

回答

3

你需要使用一個超前而不是消費模式(.*?)之後的比賽變成重疊:

\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)。 –

相關問題