R正则表达式:将\\b与'Å';与';A';人物

R正则表达式:将\\b与'Å';与';A';人物,r,regex,R,Regex,\\b表示单词边界。我不明白为什么这个操作符根据后面的字符有不同的效果。例如: test1 <- 'aland islands' test2 <- 'åland islands' regex1 <- "[å|a]land islands" regex2 <- "\\b[å|a]land islands" grepl(regex1, test1, perl = TRUE) [1] TRUE grepl(regex2, test1, perl = TRUE) [1] TR

\\b
表示单词边界。我不明白为什么这个操作符根据后面的字符有不同的效果。例如:

test1 <- 'aland islands'
test2 <- 'åland islands'

regex1 <- "[å|a]land islands"
regex2 <- "\\b[å|a]land islands"

grepl(regex1, test1, perl = TRUE)
[1] TRUE
grepl(regex2, test1, perl = TRUE)
[1] TRUE

grepl(regex1, test2, perl = TRUE)
[1] TRUE
grepl(regex2, test2, perl = TRUE)
[1] FALSE
不幸的是,在我的应用程序中,我绝对需要保持
perl=TRUE

这是R的regex子系统中的一个(已知)故障,与输入的字符编码和系统区域设置/构建属性有关

关于国家的R文件(添加了突出显示):

gsub和gregexpr的POSIX 1003.2模式无法正常工作 具有重复的单词边界(例如,pattern=“\b”)。使用perl=TRUE 对于此类匹配(),但对于非ASCII,这可能无法按预期工作 输入,因为“word”的含义取决于系统

这里只提到了
gsub
grepexpr
grepl
似乎也受到了影响

可能的原因
  • 使用R的默认()正则表达式引擎:
    PERL=FALSE
    ,正如您已经发现的那样
  • 使用
    *UCP
    标志(Unicode模式| Unicode字符属性)使用PCRE()正则表达式,这会更改匹配行为,从而使Unicode字母数字不被视为单词边界:

    代码示例:

    options(encoding = "UTF-8")
    
    test1 <- 'aland islands'
    test2 <- 'åland islands'
    regex1 <- "[å|a]land islands"
    regex2 <- "(*UCP)\\b[å|a]land islands"    
    grepl(regex1, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex2, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex1, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex2, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex1, test2, perl = FALSE)
    #[1] TRUE
    grepl(regex2, test2, perl = FALSE)
    #[1] FALSE
    
    选项(编码=“UTF-8”)
    测试1我无法确认:
    grepl(\\b[|a]land islands”,“åland islands”,perl=TRUE)
    为我返回
    TRUE
    。@你在使用Windows吗?@wp78de我在MacOS和Linux上。我无法产生错误。正如@wp78de在他们的回答中指出的那样,我在Windows上,这种行为令人讨厌的地方在于它在不同平台之间是不一致的。当我看到您无法复制时,我尝试了不同的方法:奇怪的行为出现在我通常使用的Docker环境中,但当我在osx上直接从终端运行R时就不会出现。这很烦人。这是一个很好的答案。非常感谢你花时间写这篇文章;我真的很感激。我将阅读所有这些链接,并在下次遇到类似问题时获得更好的信息。
    options(encoding = "UTF-8")
    
    test1 <- 'aland islands'
    test2 <- 'åland islands'
    regex1 <- "[å|a]land islands"
    regex2 <- "(*UCP)\\b[å|a]land islands"    
    grepl(regex1, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex2, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex1, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex2, test2, perl = TRUE)
    #[1] TRUE
    grepl(regex1, test2, perl = FALSE)
    #[1] TRUE
    grepl(regex2, test2, perl = FALSE)
    #[1] FALSE