perl中支持Unicode的字边界

Ado*_*obe 0 regex unicode perl

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

$ echo '""test"" ""????""' | perl -pe 's/""\b/“/g'
“test"" ""????""
Run Code Online (Sandbox Code Playgroud)

在我预期的地方“test"" “????"".

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

$ echo '""test"" ""????""' | perl -pe 's/""\b{wb}/“/g'
“test“ “????“
Run Code Online (Sandbox Code Playgroud)

在我预期的地方“test"" “????"".

我的问题是:谁做我转换""test"" ""????""“test"" “????""通过正则表达式的Perl?

ike*_*ami 6

你告诉s///要匹配以下内容:

22.22.74.65.73.74.22.22.20.22.22.D1.82.D0.B5.D1.81.D1.82.22.22.A
Run Code Online (Sandbox Code Playgroud)

s///(或者更具体地说,\b),期望Unicode代码点,这意味着上面被视为

""test"" ""Ñ<82>еÑ<81>Ñ<82>""
Run Code Online (Sandbox Code Playgroud)

这显然不是你想要的字符串.


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

s/""\b/“/g
Run Code Online (Sandbox Code Playgroud)

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


解码输入.编码输出.

$ echo '""test"" ""????""' | perl -pe'
    use utf8;
    use open ":std", ":encoding(UTF-8)";
    s/""\b/“/g
'
“test"" “????""
Run Code Online (Sandbox Code Playgroud)

要么

$ echo '""test"" ""????""' | perl -CSDA -Mutf8 -pe's/""\b/“/g'
“test"" “????""
Run Code Online (Sandbox Code Playgroud)