2016-08-01 298 views
3

我學習有關Java正則表達式,我注意到以下操作:的\ 1含義*運營商在Java中的正則表達式

\\*1 

我有很難搞清楚這意味着什麼(在搜索網站沒有幫助)。 例如,正是這兩個選項之間的區別:

Pattern p1 = Pattern.compile("(a)\\1*"); // option1 
    Pattern p2 = Pattern.compile("(a)"); // option2 

    Matcher m1 = p1.matcher("a"); 
    Matcher m2 = p2.matcher("a"); 

    System.out.println(m1.group(0)); 
    System.out.println(m2.group(0)); 

結果:

a 
a 

謝謝!

+1

它被稱爲反向引用 – anubhava

+2

這是一個反向引用。快速谷歌顯示,這顯然不能在Java中工作,你必須使用別的東西:https://stackoverflow.com/questions/18888877/in-java-regular-expression-1-back-reference-is-not工作 – KdgDev

+1

@KdgDev它可以在Java中正常工作,但不在替換表達式中。 – assylias

回答

3

\\1是在此情況下對應的第一個捕獲組,即(a)

因此(a)\\1*相當於(a)a*在這種特殊情況下。

下面是一個例子,顯示了區別:

Pattern p1 = Pattern.compile("(a)\\1*"); 
Pattern p2 = Pattern.compile("(a)"); 

Matcher m1 = p1.matcher("aa"); 
Matcher m2 = p2.matcher("aa"); 

m1.find(); 
System.out.println(m1.group()); 
m2.find(); 
System.out.println(m2.group()); 

輸出:

aa 
a 

正如你可以看到,當你有幾個a第一正則表達式捕獲所有的連續a而第二個只捕獲第一個。

+0

明白了。謝謝。 – Friedman

2

\\1*再次尋找a,0次或更多次。也許更容易理解是這個例子中,使用(a)\\1+,看起來至少2個a S:

Pattern p1 = Pattern.compile("(a)\\1+"); 
Matcher m1 = p1.matcher("aaaaabbaaabbba"); 
while (m1.find()) System.out.println(m1.group()); 

輸出將是:

AAAAA
AAA

但最後的a將不匹配,因爲它不會重複。

1

在Perl中,\ 1到\ 9總是被解釋爲反向引用;如果至少存在多個子表達式,則大於9的反斜槓轉義數字將被視爲反向引用,否則會在可能的情況下將其解釋爲八進制轉義。在這個類中,八進制轉義符必須始終以零開頭。在這個類中,\ 1到\ 9總是被解釋爲反向引用,如果在正則表達式中至少有那麼多個子表達式存在,那麼將會接受一個更大的數字作爲反向引用,否則解析器將丟棄數字,直到數字小於或等於現有的組數或者是一位數。

來自Pattern文檔。

所以看起來p2是隻爲一個"a"p1是用於任何數量的"a"只要至少有一個良好。該明星是X* X, zero or more times。它被稱爲Kleene星。