- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
\\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
时才是问题:
grepl(regex1, test2, perl = FALSE)
[1] TRUE
grepl(regex2, test2, perl = FALSE)
[1] TRUE
不幸的是,在我的应用程序中,我绝对需要保持 perl=TRUE
。
最佳答案
这是 R 的正则表达式子系统中的一个(已知)故障,与输入的字符编码和系统区域设置/内置属性有关。
grep 上的 R 文档状态(添加了突出显示):
The POSIX 1003.2 mode of gsub and gregexpr does not work correctly with repeated word-boundaries (e.g., pattern = "\b"). Use perl = TRUE for such matches (but that may not work as expected with non-ASCII inputs, as the meaning of ‘word’ is system-dependent).
这里只提到了gsub
和grepexpr
grepl
似乎也受到了影响。
PERL=FALSE
正如您已经发现的那样。坚持使用 PCRE ( reference ) 正则表达式使用 *UCP
标志(Unicode 模式|Unicode 字符属性),它改变了匹配行为,因此 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
注意事项:
使用带有 (*UCP) 标志的 TRE 的第 6 个测试失败了 grepl(regex2, test2, perl = FALSE)
如果 R 未安装 PCRE 的 Unicode 支持,则 *UCP
标志不起作用(可能是 some environments 中的情况,例如一些最小的 Cloud/Docker 安装)。
真正恼人的是 R 的行为在不同平台上是不一致的:
使用这些在线 R 环境测试您的原始代码:
只有测试用例 4 为假:gepl(regex2, test2, perl = TRUE)
(在 Linux 上运行 R 3.3/3.4?)
测试用例 4 和 6 为 FALSE(在 Linux 上运行 R 3.3-3.5?)
进一步阅读:
关于R 正则表达式 : using\\b with 'Å' vs. 'A' 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51470095/
我是一名优秀的程序员,十分优秀!