gpt4 book ai didi

regex - 正则表达式 [A-Za-z] 似乎不包括字母 W 和 w

转载 作者:行者123 更新时间:2023-12-04 01:25:55 26 4
gpt4 key购买 nike

不知为何,不知为何,可能是我的系统或脑子不太对劲,正则表达式“[A-Z]”似乎无法识别字母“W”和“[a-z]”似乎无法识别字母“w”。示例:

for x in A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Y y Z z; do echo $x | egrep "[A-Za-z]"; done

我的输出是:一个一个乙bCC丁d乙电子FFGGHH我一世杰j钾k大号升米米否n欧oPp问qRr小号秒吨吨ü你VvXX是是Zz

如您所见,字母“W”和“w”都丢失了。我是唯一一个?什么可能导致这个?如果它是一个错误,我应该在哪里报告它?这发生在 bash 和 zsh 中,它发生在 sed 和 egrep 中(可能更多,我只测试了这两个),所以问题似乎与一般的正则表达式有关......:o那么……这是怎么回事??

  • Manjaro 17.1.12
  • XFCE 4.12
  • bash 4.4.23(1)-release (x86_64-unknown-linux-gnu)
  • zsh 5.5.1 (x86_64-unknown-linux-gnu)
  • egrep 3.1
  • sed 4.5

编辑:有人询问我的语言环境,所以在这里。

$ locale        
LANG=sv_SE.utf8
LC_CTYPE="sv_SE.utf8"
LC_NUMERIC=sv_SE.UTF-8
LC_TIME=sv_SE.UTF-8
LC_COLLATE="sv_SE.utf8"
LC_MONETARY=sv_SE.UTF-8
LC_MESSAGES="sv_SE.utf8"
LC_PAPER=sv_SE.UTF-8
LC_NAME=sv_SE.UTF-8
LC_ADDRESS=sv_SE.UTF-8
LC_TELEPHONE=sv_SE.UTF-8
LC_MEASUREMENT=sv_SE.UTF-8
LC_IDENTIFICATION=sv_SE.UTF-8
LC_ALL=

如果这是问题所在,那么我猜任何决定 sv_SE.UTF-8 的东西都是错误的,因为字母“w”是在 2006 年添加到瑞典字母表中的。此外,如果 A-Z 间隔取决于当前语言环境,当语言环境设置为瑞典语时,[A-Ö] 不应该适用于整个瑞典字母表吗?它没有,它给出了一条错误消息。然而 [[:alpha:]] 似乎包含所有瑞典字母,所以我想我对此很满意。

最佳答案

从技术上讲,在 Posix 正则表达式中使用诸如 [a-z] 的范围表达式(与 grep 实用程序一样)仅在 Posix (C) 语言环境中具有指定的行为。这意味着您确实无法在 sv_SE 语言环境(或任何其他国际化语言环境)中可靠地使用范围表达式。但是,您可以可靠地使用字符类,例如 [[:lower:]][[:alpha:]][[:alnum: ]] 等等,这通常是您应该做的。

话虽如此,我相信您遇到的确实是 v2.28 中引入的 glibc 中的错误,因为以前版本的 sv_SE 语言环境正确放置了 w在小写范围内,W 在大写范围内。我认为此更改不符合用户的期望,因为它会破坏正则表达式范围表达式,尽管这些表达式具有未指定的行为,但以前仍按预期工作。

该问题大约一个月前被报告为 glibc 错误,并且由于缺乏文档几乎立即关闭;昨天,我requested that it be reopened . (更新:那个 bug 被重新认定为另一个 bug 的重复,其最终解决方案只能是对底层设计问题的全面解决方案。换句话说,glibc 团队知道存在问题但不屏住呼吸寻求解决方案。)

我在 this repository 中放置了一个可能的替换 sv_SE 语言环境定义文件,以防它被证明对某人有用。请不要安装它,除非您在使用 glibc 的语言环境定义时遇到问题。

我在上面链接的错误报告中的过长评论试图列出问题,这更多是定义问题而不是实现问题。本质问题是很难(如果不是不可能的话)定义一个与整个字符串比较顺序完全一致的单字符排序顺序。阅读 Posix 基本原理文档中的字里行间,似乎很明显,很多人都用头撞过这堵特殊的砖墙,但从未设法提出一个具有实现共识的实用可移植提案。 (“如上所述,已努力解决差异,但尚未找到足够具体的解决方案以允许可移植软件,同时又不会使现有实现无效。”)

对各种语言环境定义文件的善意清理导致瑞典语语言环境中的字符顺序发生变化。它没有改变字符串排序顺序,因此 VW 继续像以前一样排序(也就是说,就好像它们是同一字母的变体拼写而不是不同的字母),并且它没有改变 CTYPE 定义,所以 Ww 继续是字母(因此匹配 [[:alpha:]]) 和以前一样。但它确实(我相信是意外地)改变了字符顺序。之前,W 跟在 V 之后,w 跟在 v 之后,所以 W 匹配 [U-X]w 匹配 [u-x]。更改将两个字符放在刺 (þ) 之后,这意味着它不能匹配任何范围表达式。 (正则表达式范围表达式仅限于单字节代码点。)


A previous question已被建议作为此问题的重复项,但我删除了重复标记,因为该问题侧重于使用 [a-z] 的智慧而不是可能的实现错误,还因为它是关于 Perl 正则表达式的而不是 Posix 正则表达式。但是,答案中有很多有用的信息。

关于regex - 正则表达式 [A-Za-z] 似乎不包括字母 W 和 w,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com