R 有几个用于正则表达式的特殊的与语言环境无关的字符类。
\n\n从?regex:
\n\n\n\xe2\x80\x98[[:alnum:]]\xe2\x80\x99 表示 \xe2\x80\x98[0-9A-Za-z]\xe2\x80\x99,但后者\n 取决于区域设置和字符编码,而前者独立于区域设置和字符集。
\n
我想知道何时会出现特定于区域设置的问题。
\n\n我根据中的信息尝试了两个例子?Comparison,描述了字符串的排序方式:
\n\n\n在爱沙尼亚语中, \xe2\x80\x98Z\xe2\x80\x99 位于 \xe2\x80\x98S\xe2\x80\x99 和 \xe2\x80\x98T\xe2\x80\x99 之间
\n
和
\n\n\n\n\n在丹麦语中 \xe2\x80\x98aa\xe2\x80\x99 在 \xe2\x80\x98z\xe2\x80\x99 之后排序为单个字母
\n
在第一个示例中,我希望 T、U、V、W、X 和 Y 不匹配。在第二个示例中,我希望 aa 不匹配。
\n\nSys.setlocale("LC_ALL", "Estonian")\ngrepl("[A-Z]", LETTERS)\n\nSys.setlocale("LC_ALL", "Danish")\ngrepl("[a-z]", "aa") \nRun Code Online (Sandbox Code Playgroud)\n\n由于所有值都返回TRUE,因此区域设置在这里似乎不是问题。
你能找到一个例子,其中区域设置导致传统的正则表达式类,例如[a-z]失败的示例吗?
更新:我有一个部分答案:带重音的罗马字符使用[a-zA-Z]与使用时的行为不同。[[:alpha:]]行为有所不同。我仍然有兴趣知道是否有更多差异示例,以及区域设置或编码是否影响非罗马字符的匹配,以及如何匹配非罗马字符。
带口音的罗马字符的行为似乎有所不同。
\n\ngrepl("[a-zA-Z]", c("\xc3\xa5", "\xc3\xa9"))\n## [1] FALSE FALSE\ngrepl("[[:alpha:]]", c("\xc3\xa5", "\xc3\xa9"))\n## [1] TRUE TRUE\nRun Code Online (Sandbox Code Playgroud)\n\n奇怪的是,非罗马字符无法匹配任一字符类(至少在我尝试过的少数语言环境和编码中)。
\n\nmu <- "\\U03BC"\nya <- "\\U044F"\njeem <- "\\U062C"\ngrepl("[a-zA-Z]+", c(mu, ya, jeem))\n## [1] FALSE FALSE FALSE\ngrepl("[[:alpha:]]", c(mu, ya, jeem))\n## [1] FALSE FALSE FALSE\nRun Code Online (Sandbox Code Playgroud)\n