我有一个R函数,试图将每个“单词”的第一个字母大写
proper = function(x){
gsub("(?<=\\b)([[:alpha:]])", "\\U\\1", x, perl = TRUE)
}
这很有效,但是当我在其中跟一个毛利人的macron这样的单词Māori
时,我会得到不正确的大写,例如
> proper("Māori")
[1] "MāOri"
显然,RE引擎认为macron ā
是一个单词边界。不知道为什么。
答案 0 :(得分:3)
由于您使用的是PCRE正则表达式引擎(使用perl=TRUE
启用),因此您必须将(*UCP)
标志传递给正则表达式,以便所有短字和字边界都能检测到Unicode文本中正确的符号/位置:
proper = function(x){
gsub("(*UCP)\\b([[:alpha:]])", "\\U\\1", x, perl = TRUE)
}
proper("Māori")
## [1] "Māori"
请参阅R demo。
请注意,\b
已经是零宽度断言,不必置于正向后看,即(?<=\b)
= \b
。
答案 1 :(得分:0)
\b
基本上表示[a-zA-Z0-9_]
以外的字符的边界,其中包括多字节字符,除非设置一个名为Unicode
的修饰符来影响引擎行为。
不幸的是,R中的gsub
没有此标记,或者我在文档中找不到任何关于它的内容。
解决方法是:
(?<!\\S)([[:alpha:]])
另一方面,显然在āmori
失败了。