Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl中UTF-8文本的单词边界_Regex_Perl_Utf 8 - Fatal编程技术网

Regex perl中UTF-8文本的单词边界

Regex perl中UTF-8文本的单词边界,regex,perl,utf-8,Regex,Perl,Utf 8,我的perl脚本提供了UTF-8格式的字符串,可以是任何语言。我需要将每个单词的第一个字符大写,并将单词的其余字符转换为小写。这必须在保留UTF-8格式文本的同时完成 当文本仅包含拉丁字符时,以下内容似乎足够有效 $my_string =~ s/([\w']+)/\u\L$1/g; 如何使其在UTF-8字符串中工作?有关您需要熟悉的设施的概述,请参阅。基本上,您正在寻找类似\p{LC}的东西 然而,你的问题空间并没有得到很好的定义;并非所有脚本都有字符大小写的概念。LC属性将只在脚本上匹配,因

我的perl脚本提供了UTF-8格式的字符串,可以是任何语言。我需要将每个单词的第一个字符大写,并将单词的其余字符转换为小写。这必须在保留UTF-8格式文本的同时完成

当文本仅包含拉丁字符时,以下内容似乎足够有效

$my_string =~ s/([\w']+)/\u\L$1/g;
如何使其在UTF-8字符串中工作?

有关您需要熟悉的设施的概述,请参阅。基本上,您正在寻找类似
\p{LC}
的东西


然而,你的问题空间并没有得到很好的定义;并非所有脚本都有字符大小写的概念。LC属性将只在脚本上匹配,因此它应该可以让您达到目标。

。。。尽管\w的更接近的替代品可能是\p{Word},顺便提一下,“\u\L$1”中的\u和\L是否总是正确地转换为大写和小写,或者是否有unicode替代品?我相信如果您的Perl足够新,它们应该是DTRT。实际上,
\p{LC}之类的东西
如果您使用的是字节字符串而不是字符串,则仍然无法使用。加上OP中提供的解决方案在5.14中已经运行良好;在编译单元的顶部编写
使用v5.14
,一切都会很好。我自己从来不为
[\p{CWL}\p{CWT}\p{CWU}]
操心。@Appleton:你问题的答案是函数是正确的,但算法是错误的。在转换为titlecase之前,不能转换为小写,因为如果转换为titlecase,可能会得到某些代码点的错误答案。永远不要写
s/(\w+/\u\L$1/g
,因为这只适用于ASCII码。要保证在Unicode上正常工作,您必须编写
s/(\w)(\w*)/\u$1\L$2/g
。看到区别了吗?casemapping没有往返保证,casemapping中也没有传递平等的保证。事实上,我可以找到这样的代码点,Perl没有UTF-8字符串。它有Unicode格式的字符串,也有字节格式的字节字符串。您在那里编写的内容在当前版本的Perl中已经可以正常工作。您可能需要类似于编译单元顶部的
使用v5.12
使用v5.14
使用功能“unicode_字符串”
之类的东西才能使其正常工作,但您不需要其他任何东西。谢谢。我忘了提到我正在使用的web服务器仍然有5.8Perl,所以不幸的是,这些建议对我都不可用。