$1
不是Java正則表達式中的反向引用,也不是我能想到的其他任何風格。
String input="A12.3 bla bla my input";
input = StringUtils.replacePattern(
input, "^([A-Z]\\d{2}\\.\\d).*$", "$1");
// ^^^^
有大約一回基準是什麼,包括非常到位我得到的片段從一些誤傳:simple java regex with backreference does not work你只當你是更換東西使用$1
。
Java之外的現有口味在$
已經是一個元字符仿照它的正則表達式的語法。它錨定到字符串的末尾(或多行模式下的行)。
同樣,Java使用\1
作爲反向引用。因爲正則表達式是字符串,所以它必須被轉義:\\1
。
從詞彙/句法的角度來看,確實可以使用$1
(作爲一種獎勵,它可以防止在使用反向引用時需要「邪惡逃跑」)。
要匹配行結束之後,是1
正則表達式將需要$\n1
:
this line
1
它只是更有意義使用,而不是改變規則的一種熟悉的語法,其中大部分來自Perl。
Perl中的第一個版本在1987出來,這比Java,這是在發佈要早得多[1995]
我挖出man pages for Perl 1,其中說:
的包圍結構(\ ...\)
也可以使用,在這種情況下,\<digit>
匹配digit
'的子字符串。 (圖案之外,總是在數字的前面使用$
代替\
。的$<digit>
(和$\`
,$&
和$'
範圍)延伸到封閉塊或EVAL字符串的末尾,或者到下一個模式匹配與子表達式。\<digit>
表示法有時可以在當前模式之外工作,但不應該依賴)。您可以根據需要使用多個括號。如果您有超過9個子字符串,變量$10
,$11
,...引用相應的子字符串。在該模式內,如果在反向引用之前至少存在那麼多左側parens,那麼\10
,\11
等等將返回到子字符串。否則(爲了向後兼容)\10
與\010
相同,是一個退格鍵,\11
與\011
相同,是一個製表符。等等。 (\1
到\9
始終是反向引用。)
這不僅僅是Java,在大多數正則表達式中,'\ N'是正則表達式模式中的反向引用。 '$'在正則表達式中有特殊的含義 – anubhava
是的,「$」表示表達式的結尾,但爲什麼它們不用'\ N'來替換呢? – Jaumzera
其中一些像'python','sed'或'perl'允許替換'\ N',但Java設計者決定使用'$'符號 – anubhava