2013-07-04 61 views
1

這些是什麼意思?這些qr {}正則表達式是什麼意思?

qr{^\Q$1\E[a-zA-Z0-9_\-]*\Q$2\E$}i 
qr{^[a-zA-Z0-9_\-]*\Q$1\E$}i 

如果$pattern是一個Perl的正則表達式,什麼是$identity在下面的代碼?

$identity =~ $pattern; 
+0

什麼,你的「身份」的意思是?你的意思是數學身份?如果是的話,你如何定義'=〜'運算符的輸出(哪個上下文:列表/標量)?你不瞭解正則表達式的哪一部分? – amon

回答

4

約束運算符=~將正則表達式應用於字符串變量。這是記錄在perldoc perlop

\Q ... \E轉義序列是一種引用元字符(也記錄在perlop中)的方法。它允許可變插值,這就是爲什麼你可以在這裏使用它$1$2。但是,在正則表達式中使用這些變量有些不便,因爲它們本身是在正則表達式中使用捕獲期間定義的。

字符類括號[ ... ]定義了它將匹配的字符範圍。它後面的量詞是*表示特定的括號必須匹配零次或多次。破折號表示範圍,例如a-z表示「從a到z」。逃脫破折號\-意味着字面上的破折號。

^$(最後的美元符號)分別表示錨點,字符串的開始和結束。在末端改性劑i裝置匹配時是不敏感的。

在您的例子,$identity是可能包含一個字符串(或任何它包含將被轉換爲一個字符串)的變量。

5

=~的RHS不m//s///tr///,一個匹配操作符(m//)是隱含的。

$identity =~ $pattern; 

相同

$identity =~ /$pattern/; 

它針對的$identity值的圖案或預編譯的正則表達式$patternqr//)相匹配。

1

perlre文檔是你的朋友在這裏。搜索它不熟悉的正則表達式結構。

詳細解釋低於,但它是如此多毛的是不知如Text::Balanced是否使用一個模塊將是一個優越的方法。


第一個模式匹配可能是空分隔字符串,分隔符是$1$2,我們不知道,直到運行時。說$1($2),則第一模式相匹配的形式的字符串

  • ()
  • (a)
  • (9)
  • (abcABC_012-)
  • 等…

第二圖案匹配終止串,其中所述終止子是在$1 —也不知道到運行時。假設終止劑爲],則第二模式相匹配的形式

  • ]
  • a]
  • Aa9a_9]

使用\Q...\E周圍的圖案的字符串從刪除任何特殊正則表達式含義如perlop中所記錄的字符:

對於正則表達式運算符(qr//m//s///)的圖案,從\Q的引用被內插處理之後應用,但逃逸處理之前。這允許模式字面匹配(除了$@)。例如,下面的比賽:

'\s\t' =~ /\Q\s\t/ 

因爲$@觸發內插,你需要使用類似/\Quser\E\@\Qhost/逐字匹配。

在你的問題的模式確實要觸發插值但希望任何正則表達式元字符有特殊的含義,如用括號和方括號上面說是爲了字面匹配。

其他部分:

  • 外切括號劃定一個字符類。例如,[a-zA-Z0-9_\-]可匹配大寫或小寫字母A到Z(但不包含任何重音或其他附加字符),零到九,下劃線或連字符的任何單個字符。請注意,連字符在最後被轉義以強調它與文字連字符匹配,而不指定範圍的一部分。

  • *量詞意味着匹配零個或多個前面的子模式。在你的問題的例子中,星星重複字符類。

  • 這些模式用^$括起來,這意味着整個字符串必須匹配而不是一些子字符串才能成功。

  • i最後,在關閉大括號之後,是一個正則表達式開關,它使模式不區分大小寫。正如TLP在下面的評論中指出的那樣,這使得分隔符或終結符匹配時不考慮大小寫是否包含字母。

表達$identity =~ $pattern測試存儲在$pattern(與$pattern = qr{...}創建)編譯正則表達式是否在$identity的文本相匹配。如上所述,它可能被評估爲在$1,$2等中存儲捕獲組的副作用。這是一個紅旗。 決不使用$1和朋友無條件而是寫

if ($identity =~ $pattern) { 
    print $1, "\n"; # for example 
} 
+3

'\ Q $ 1 \ E'確實不匹配文字美元符號,它會插入變量。另外,'i'修飾符不是多餘的,因爲它與'$ 1'和'$ 2'內的內容動態地工作(儘管我幾乎也這麼認爲)。 – TLP

+0

@TLP哇,微妙。謝謝並修復! –

+0

不客氣。 – TLP

相關問題