我正在从 perl 翻译代码,我遇到了以下行
$text =~ s/([?!\.][\ ]*[\'\"\)\]\p{IsPf}]+) +([\'\"\(\[\¿\¡\p{IsPi}]*[\ ]*[\p{IsUpper}])/$1\n$2/g;
我的问题是, \p{IsPf} 和 \p{IsPi} 匹配什么?我已经尝试在网上搜索它,但没有找到任何东西......
\p{..}
通过 unicode 字符属性匹配字符:http: //perldoc.perl.org/perlunicode.html#Unicode-Character-Properties
特别是\p{IsPf}
匹配具有“ final punctuation ”属性\p{IsPi}
的字符,并匹配具有“ initial punctuation ”属性的字符。这些似乎主要是关闭和打开报价。
考虑到句子可能以各种类型的标点符号开头和结尾,替换的重点似乎是通过匹配句子的结尾和开头将句子分成单独的行。
让我们问一下RegexBuddy:这是一个 Unicode 字符属性。
作为一些额外的信息,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