有点perl的正则表达式的含义?

时间:2013-06-04 11:11:29

标签: regex perl

我正在翻译来自perl的代码,我来到了以下行

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

我的问题是,\ p {IsPf}和\ p {IsPi}匹配到什么?我试过网上搜索但没找到任何东西......

3 个答案:

答案 0 :(得分:11)

\p{..}通过其unicode字符属性匹配字符:http://perldoc.perl.org/perlunicode.html#Unicode-Character-Properties

特别是,\p{IsPf}匹配具有“final punctuation”属性的字符,\p{IsPi}匹配具有“initial punctuation”属性的字符。这些似乎主要是关闭和打开报价。

替换点似乎是通过匹配句子的结尾和开头将句子分成单独的行,同时考虑到句子可以以各种类型的标点符号开头和结尾。

答案 1 :(得分:10)

让我们问RegexBuddy:这是一个Unicode字符属性。

RegexBuddy Screenshot

您可以找到更多documentation on Unicode character properties and Unicode scripts here

答案 2 :(得分:3)

作为一些额外信息,来自Unicode::Tussleunichars可用于列出匹配的字符。

$ 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