Regex perl中支持Unicode的单词边界

Regex perl中支持Unicode的单词边界,regex,perl,unicode,Regex,Perl,Unicode,我使用的是perl-5.24,偶然发现\b不支持unicode: $ echo '""test"" ""тест""' | perl -pe 's/""\b/“/g' “test"" ""тест"" 正如我所期望的那样,“测试”“测试” 然后我学习了perl-5.22.1正则表达式中的unicode扩展,特别是这一扩展:\b{wb} $ echo '""test"" ""тест""' | perl -pe 's/""\b{wb}/“/g' “test“ “тест“ 正如我所期望的那样,

我使用的是perl-5.24,偶然发现
\b
不支持unicode:

$ echo '""test"" ""тест""' | perl -pe 's/""\b/“/g'
“test"" ""тест""
正如我所期望的那样,“测试”“测试”

然后我学习了perl-5.22.1正则表达式中的unicode扩展,特别是这一扩展:
\b{wb}

$ echo '""test"" ""тест""' | perl -pe 's/""\b{wb}/“/g'
“test“ “тест“
正如我所期望的那样,“测试”“测试”


我的问题是:我应该通过perl正则表达式将
“test”“test”“test”“test”“test”“test”“test”“test”“
转换为谁?

您告诉
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/“/g
s//
(或者更具体地说,
\b
)需要Unicode代码点,因此这意味着上述代码点被视为

""test"" ""Ñ<82>еÑ<81>Ñ<82>""
Perl希望脚本使用ASCII编码,除非您使用UTF-8编码脚本并添加
使用utf8;
让它知道


对输入进行解码。对输出进行编码。

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


您让
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/“/g
s//
(或者更具体地说,
\b
)需要Unicode代码点,因此这意味着上述代码点被视为

""test"" ""Ñ<82>еÑ<81>Ñ<82>""
Perl希望脚本使用ASCII编码,除非您使用UTF-8编码脚本并添加
使用utf8;
让它知道


对输入进行解码。对输出进行编码。

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


@ikegami:是的,我正在通过UTF-8。但是现在世界不是大部分都是UTF-8吗?不,世界是用解码文本(
字符串
而不是
字节[]
读卡器
s而不是
s,等等)这样一来,它们的编码是不可知的,而且它们可以简单得多,因为它们不担心字符的编码宽度。@ikegami:是的,我正在传递UTF-8。但现在世界不是大部分都是UTF-8吗?不,世界使用解码文本(
String
而不是
byte[]
Reader
s over
Stream
s,等等)通过这种方式,它们的编码是不可知的,而且它们可以简单得多,因为它们不担心字符的编码宽度。从技术上讲,
ini
也是一个
\w
字符,因此
\b
应该匹配,但这不是因为Perl中的一个错误,它是通过添加
使用功能qw(unicode\u字符串)修复的
使用5.014;
。我没有提到这一点,因为一旦我们以正确的方式解决了您的问题,Perl中的这个错误就变得毫无意义了。谢谢。我想从今天起我将使用
-CSDA-Mutf8
。从技术上讲,
也是
\w
字符,因此
\b
应该匹配,但这不是因为Perl中的错误通过添加
使用功能qw(unicode_字符串);
使用5.014;
可以解决这个问题。我没有提到这一点,因为一旦我们以正确的方式解决了您的问题,Perl中的这个错误就变得毫无意义了。谢谢。我想从今天起我将使用
-CSDA-Mutf8