R中非ASCII字符的正向观察

时间:2017-12-02 06:10:29

标签: r regex

我有一个R函数,试图将每个“单词”的第一个字母大写

proper = function(x){
  gsub("(?<=\\b)([[:alpha:]])", "\\U\\1", x, perl = TRUE)
}

这很有效,但是当我在其中跟一个毛利人的macron这样的单词Māori时,我会得到不正确的大写,例如

> proper("Māori")
[1] "MāOri"

显然,RE引擎认为macron ā是一个单词边界。不知道为什么。

2 个答案:

答案 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失败了。

相关问题