perl中支持Unicode的字边界

时间:2017-12-19 15:54:04

标签: regex perl unicode

我在perl-5.24上,偶然发现\b不知道unicode:

$ echo '""test"" ""тест""' | perl -pe 's/""\b/“/g'
“test"" ""тест""

我预期的地方是“test"" “тест""

然后我了解了perl-5.22.1正则表达式中的unicode扩展,特别是这个:\b{wb}。但是通过这些扩展我仍然得到错误的结果:

$ echo '""test"" ""тест""' | perl -pe 's/""\b{wb}/“/g'
“test“ “тест“

我预期的地方是“test"" “тест""

我的问题是:我是通过perl正则表达式将""test"" ""тест""转换为“test"" “тест""的?

1 个答案:

答案 0 :(得分:6)

您告诉s///以匹配以下内容:

22.22.74.65.73.74.22.22.20.22.22.D1.82.D0.B5.D1.81.D1.82.22.22.A

s///(或更具体地,\b),需要Unicode代码点,这意味着上述内容被视为

""test"" ""Ñ<82>еÑ<81>Ñ<82>""

显然不是你想要的字符串。

同样,您声称您的代码包含以下内容:

s/""\b/“/g

Perl希望使用ASCII编码脚本​​,除非您使用UTF-8对脚本进行编码并添加use utf8;以便让它知道。

解码输入。编码输出。

$ echo '""test"" ""тест""' | perl -pe'
    use utf8;
    use open ":std", ":encoding(UTF-8)";
    s/""\b/“/g
'
“test"" “тест""

$ echo '""test"" ""тест""' | perl -CSDA -Mutf8 -pe's/""\b/“/g'
“test"" “тест""