2014-01-16 98 views
4

您能幫我用正則表達式來匹配兩個最接近的單詞之間的文本嗎?正則表達式匹配兩個最接近的單詞之間的文本

例如:

text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2 

的結果必然是:

KEYWORD1 text KEYWORD2 

這是不行的,這是可以預見的:

(KEYWORD1).*(KEYWORD2) 

它甚至有可能做到這一點與正則表達式?如果是這樣,它將如何與有限狀態機一起工作?
Java regexp語法將是最好的。先謝謝你!

+0

匹配相匹配看看貪婪vs非貪婪的正則表達式。 – Trenin

回答

6

更新:

String val="text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2"; 
String REGEX="KEYWORD1((.(?!KEYWORD1))+?)KEYWORD2"; 
Pattern pattern = Pattern.compile(REGEX); 
Matcher matcher = pattern.matcher(val); 
if(matcher.find()){ 
    System.out.println(matcher.group()); 
} 

檢查這個數字看,這是如何工作的:

enter image description here

Explanation :

第一捕獲組((.(?!KEYWORD1))+?)

第二捕獲組(.(?!KEYWORD1))+?

量詞(+?):介於一個和無限次,儘可能少的次數儘可能,擴大視需要[懶惰]

注意:重複捕獲組將只捕獲最後一次迭代。 把捕獲組周圍的重複組來捕獲所有 迭代或使用非捕獲組,而不是如果你不 感興趣的數據

.匹配任何字符(除換行符) (?!KEYWORD1)負前瞻 - 斷言,這是不可能符合以下 KEYWORD1正則表達式中的字符KEYWORD1字面上(區分大小寫) KEYWORD2字符KEYWORD2字面上(區分大小寫)

1

使用式斷言:

String myString = 
    "text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2"; 
Pattern pattern = Pattern.compile("KEYWORD1((.(?!KEYWORD1))+?)KEYWORD2"); 
Matcher matcher = pattern.matcher(myString); 
String word = ""; 
if (matcher.find()) 
    word = matcher.group(1); 

// word => " text " 

Demo

相關問題