我正在翻译来自perl的代码,我来到了以下行
$text =~ s/([?!\.][\ ]*[\'\"\)\]\p{IsPf}]+) +([\'\"\(\[\¿\¡\p{IsPi}]*[\ ]*[\p{IsUpper}])/$1\n$2/g;
我的问题是,\ p {IsPf}和\ p {IsPi}匹配到什么?我试过网上搜索但没找到任何东西......
答案 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字符属性。
您可以找到更多documentation on Unicode character properties and Unicode scripts here。
答案 2 :(得分:3)
作为一些额外信息,来自Unicode::Tussle的unichars
可用于列出匹配的字符。
$ 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