7

我正在从 perl 翻译代码,我遇到了以下行

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

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

4

3 回答 3

12

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

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

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

于 2013-06-04T11:15:28.187 回答
10

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

正则表达式好友截图

您可以在此处找到有关 Unicode 字符属性和 Unicode 脚本的更多文档

于 2013-06-04T11:15:19.160 回答
3

作为一些额外的信息,unichars来自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
于 2013-06-04T16:48:31.080 回答