簡體   English   中英

Perl正則表達式中\ 1和$ 1之間有什么區別?

[英]What is the difference between \1 and $1 in a Perl regex?

如果有的話,與1相比有什么不同,或者在所有情況下它們是否可以互換。

例:

s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;

他們都給出了相同的結果,但有什么區別嗎?

直接來自perldoc perlre

警告\\ 1對1美元

有些人習慣於寫下這樣的東西:

 $pattern =~ s/(\\W)/\\\\\\1/g; 

這對於RHS來說是一個替代品,以避免震驚sed上癮者,但這是一個骯臟的習慣。 那是因為在PerlThink中,“s ///”的右側是雙引號字符串。 通常的雙引號字符串中的“\\ 1”表示對照-A。 “/ 1”的慣用Unix含義是“s ///”。 但是,如果你習慣這樣做,那么如果你添加一個“/ e”修飾符就會讓自己陷入困境。

 s/(\\d+)/ \\1 + 1 /eg; # causes warning under -w 

或者如果你試圖這樣做

 s/(\\d+)/\\1000/; 

你不能通過說“{1} 000”來消除歧義,而你可以用“$ {1} 000”修復它。 插值操作不應與匹配反向引用的操作相混淆。

當然,它們意味着“s ///”左側有兩個不同的東西。

我只在極少數情況下使用\\1 ,我需要匹配包含重復模式的早期部分。 例如

/(foo|bar)baz\1/

這將匹配“foobazfoo”或“barbazbar”而不是“foobazbar”。 不能在那里使用$1

在所有其他情況下,我使用$1和親屬,因為使用其他表示法的問題太多了。 有關所有血腥細節,請參閱perlre

它們給出了相同的結果,但是1美元保留了它的值,而1則沒有。 試試這個:

s/([a-z]+),afklol/$1,bck/;
print "\$1 is $1\n";
#against
s/([a-z]+),afklol/\1,bck/;
print "\\1 is \1\n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM