R有几个特殊的与语言环境无关的正则表达式字符类.
从?正则表达式:
‘[[:alnum:]]’ means ‘[0-9A-Za-z]’,except the latter
depends upon the locale and the character encoding,whereas the
former is independent of locale and character set.
我想知道何时可能出现特定于语言环境的问题.
我根据“比较帮助”页面中的信息尝试了两个示例,它描述了字符串的排序方式:
in Estonian ‘Z’ comes between ‘S’ and ‘T’
和
in Danish ‘aa’ sorts as a single letter,after ‘z’
在第一个例子中,我希望T,U,V,W,X和Y不匹配.在第二个例子中,我希望aa不匹配.
Sys.setlocale("LC_ALL","Estonian") grepl("[A-Z]",LETTERS) Sys.setlocale("LC_ALL","Danish") grepl("[a-z]","aa")
由于所有值都返回TRUE,因此区域设置似乎不是问题.
你能找到一个例子,其中locale导致传统的正则表达式类如[a-z]失败吗?
更新:我有一个部分答案:使用[a-zA-Z]与[[:alpha:]]的重音罗马字符表现不同.我仍然有兴趣知道是否有更多的差异示例,以及区域设置或编码是否会影响非罗马字符的匹配,实际上,您是如何匹配非罗马字符的.
解决方法
似乎重音罗马字符的行为存在差异.
grepl("[a-zA-Z]",c("å","é")) ## [1] FALSE FALSE grepl("[[:alpha:]]","é")) ## [1] TRUE TRUE
奇怪的是,非罗马字符无法匹配任何一个字符类(至少在我尝试过的少数语言环境和编码中).
mu <- "\U03BC" ya <- "\U044F" jeem <- "\U062C" grepl("[a-zA-Z]+",c(mu,ya,jeem)) ## [1] FALSE FALSE FALSE grepl("[[:alpha:]]",jeem)) ## [1] FALSE FALSE FALSE