Regex perl中支持Unicode的单词边界
我使用的是perl-5.24,偶然发现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“ “тест“ 正如我所期望的那样,
\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 overStream
s,等等)通过这种方式,它们的编码是不可知的,而且它们可以简单得多,因为它们不担心字符的编码宽度。从技术上讲,ini
也是一个\w
字符,因此\b
应该匹配,但这不是因为Perl中的一个错误,它是通过添加使用功能qw(unicode\u字符串)修复的或使用5.014;
。我没有提到这一点,因为一旦我们以正确的方式解决了您的问题,Perl中的这个错误就变得毫无意义了。谢谢。我想从今天起我将使用-CSDA-Mutf8
。从技术上讲,也是\w
字符,因此\b
应该匹配,但这不是因为Perl中的错误通过添加使用功能qw(unicode_字符串);
或使用5.014;
可以解决这个问题。我没有提到这一点,因为一旦我们以正确的方式解决了您的问题,Perl中的这个错误就变得毫无意义了。谢谢。我想从今天起我将使用-CSDA-Mutf8
。