2012-05-14 71 views
0

Matcher.find從給定索引處開始查找下一個子序列,該索引與正則表達式兼容。當即時序列不匹配時,使用匹配器的Java失敗

如何使它失敗,如果下一個字符序列不符合?

例:

String input = "123456text123"; 
    Matcher mat1 = Pattern.compile("\\d+").matcher(input); 

    mat1.find(); 
    System.out.println(mat1.group()); //123456 
    mat1.find(mat1.end()); 
    System.out.println(mat1.group()); //123 

我想知道如果有一種方法,使第二個發現失敗,因爲下一個序列不MAT1的模式相匹配。

我希望能夠「組成」匹配器,以便它們必須始終按順序發現。

有沒有可能?

+1

您可以嘗試使用' 「^ \\ d +」' – Alex

+0

你試圖匹配1234foo1234但不1234foo123,並匹配4567foo4567但不4567foo456? – andersoj

+1

@Alex除了不能匹配'\ d +',然後再次成功匹配它,並且沒有插入的非匹配序列:) –

回答

1

您可以檢查前面的mat1.end()是否等於下一個mat1.start()

int lastEnd = -1; 
while (mat1.find()) { 

    // Was there any junk between last two matches? 
    if (mat1.start() != lastEnd+1) { 
     System.out.println("Fail."); 
     break; 
    } 

    System.out.println(mat1.group()); 
    lastEnd = mat1.end(); 

} 
+0

這幾乎是我正在做的,但它是手動和容易出錯的。如果API可以爲我做,它會更好。 –

+0

在開始之前,您可以檢查str.matches(「(」+ regex +「)*」),然後一起檢查。 – aioobe

+0

...或查看「(」+ regex +「)*」與find()/ end())匹配的程度以及對子字符串的限制注意。 – aioobe