2013-06-04 66 views
7

我從翻譯Perl代碼和我來翻過以下行perl的正則表達式的意義?

$text =~ s/([?!\.][\ ]*[\'\"\)\]\p{IsPf}]+) +([\'\"\(\[\¿\¡\p{IsPi}]*[\ ]*[\p{IsUpper}])/$1\n$2/g; 

我的問題是,什麼是\ p {} ISPF和\ p {} ISPI比賽?我試過在網上搜索它,但還沒有找到任何東西...

+1

順便說一句:該正則表達式中有很多不需要的反斜槓和兩個不必要的捕獲。 's/[?!。] [] * ['「)\] \ p {IsPf}] + \ K +(?= [''([{p {IsPi}] * [] * [\ p {IsUpper}])/ \ n/g'應該等同於實際目的。 – amon

回答

11

\p{..}匹配的字符可以通過Unicode字符屬性:http://perldoc.perl.org/perlunicode.html#Unicode-Character-Properties

特別地,\p{IsPf}匹配與「final punctuation」的字符組成,並\p{IsPi}匹配與「initial punctuation」屬性本地字符。這些似乎大多是封閉和開盤報價。

考慮到句子可能以各種類型的標點符號開始和結束,替換的觀點似乎是通過匹配句子的結尾和句首將句子分成單獨的行。

+0

非常感謝。您和Tim的答案都是完美的......不幸的是我必須選擇一個而不是兩個。 –

3

作爲一些額外的信息,unichars from Unicode::Tussle可用於列出匹配的字符。

$ unichars -au '\p{IsPi}' | cat 
« U+000AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 
‘ U+02018 LEFT SINGLE QUOTATION MARK 
‛ U+0201B SINGLE HIGH-REVERSED-9 QUOTATION MARK 
「 U+0201C LEFT DOUBLE QUOTATION MARK 
‟ U+0201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK 
‹ U+02039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK 
⸂ U+02E02 LEFT SUBSTITUTION BRACKET 
⸄ U+02E04 LEFT DOTTED SUBSTITUTION BRACKET 
⸉ U+02E09 LEFT TRANSPOSITION BRACKET 
⸌ U+02E0C LEFT RAISED OMISSION BRACKET 
⸜ U+02E1C LEFT LOW PARAPHRASE BRACKET 
⸠ U+02E20 LEFT VERTICAL BAR WITH QUILL 

$ unichars -au '\p{IsPf}' | cat 
» U+000BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 
’ U+02019 RIGHT SINGLE QUOTATION MARK 
」 U+0201D RIGHT DOUBLE QUOTATION MARK 
› U+0203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 
⸃ U+02E03 RIGHT SUBSTITUTION BRACKET 
⸅ U+02E05 RIGHT DOTTED SUBSTITUTION BRACKET 
⸊ U+02E0A RIGHT TRANSPOSITION BRACKET 
⸍ U+02E0D RIGHT RAISED OMISSION BRACKET 
⸝ U+02E1D RIGHT LOW PARAPHRASE BRACKET 
⸡ U+02E21 RIGHT VERTICAL BAR WITH QUILL