【发布时间】:2009-11-01 23:59:43
【问题描述】:
正则表达式 [a-Z] 是否有效,如果有效,那么它是否与 [a-zA-Z] 相同?
请注意,在 [a-Z] 中,a 是小写字母,Z 是大写字母。
编辑:
我收到了一些答案,说明虽然 [a-Z] 无效,但 [A-z] 有效(但不会与 [a-zA-Z] 相同),而这正是我一直在寻找的。 因为我想知道是否可以用更紧凑的版本替换 [a-zA-Z]。
感谢所有为回答做出贡献的人。
【问题讨论】:
标签: regex
正则表达式 [a-Z] 是否有效,如果有效,那么它是否与 [a-zA-Z] 相同?
请注意,在 [a-Z] 中,a 是小写字母,Z 是大写字母。
编辑:
我收到了一些答案,说明虽然 [a-Z] 无效,但 [A-z] 有效(但不会与 [a-zA-Z] 相同),而这正是我一直在寻找的。 因为我想知道是否可以用更紧凑的版本替换 [a-zA-Z]。
感谢所有为回答做出贡献的人。
【问题讨论】:
标签: regex
不,a (97) 高于 Z (90)。 [a-Z] 不是有效的字符类。然而[A-z] 也不等同,但出于不同的原因。它将覆盖所有字母,但也包括大小写字母之间的字符:[\]^_`。
【讨论】:
[a-Z] 无效,因为 Z 出现在 a 之前
[a-Z] 和[A-z] 都无效。不要因为我做了额外的功劳而对我投反对票。 :-)
/[a-z]/i 或 (?i)[a-z]),可能还值得添加关于使正则表达式不区分大小写以帮助比这些简单示例更复杂的任何内容的可读性的建议
我不确定其他语言的实现,但在 PHP 中你可以做到
"/[a-z]/i"
并且它不区分大小写。其他语言可能也有类似的东西。
【讨论】:
您没有指定什么语言,但通常[a-Z] 不是有效范围,因为在 ASCII 中,小写字母字符位于大写字母字符之后。 [A-z] 可能 是一个有效范围(表示所有大写和小写字母以及出现在Z 和a 之间的标点符号),但可能不是,具体取决于您的特定实施。 i 标志可以添加到正则表达式中,使其不区分大小写;检查您的特定实现以获取有关如何指定该标志的说明。
【讨论】:
您可以随时尝试:
print "ok" if "monkey" =~ /[a-Z]/;
Perl 说
正则表达式中的 [] 范围“a-Z”无效;由【讨论】:
[A-z],则不会出现错误消息,但它也不会正常工作。
如果它是有效的,它不会做你所期望的。
Z的字符代码低于a的字符代码,因此如果将代码交换为[Z-a]的范围,它将与[Z\[\\\]^_`a]相同,即包含字符Z和a,以及它们之间的字符。
如果你使用[A-z]获取所有大小写字符,那还是和[A-Za-z]不一样,和[A-Z\[\\\]^_`a-z]一样。
【讨论】:
我刚刚在一个脚本(不是我自己的)中遇到了这个问题。
似乎 grep、awk、sed 接受 [a-Z] 取决于您的语言环境(即 LANG 或 LC_CTYPE 环境变量)。在 POSIX 中,这些工具不允许 [a-Z],但在其他一些语言环境(例如 en_gb.utf8)中它可以工作,并且与 [a-zA-Z] 相同。
是的,我已经检查过了,它与 _^[]` 中的任何一个都不匹配。
鉴于调试需要相当长的时间,我强烈反对任何人在正则表达式中使用 [a-Z]。
【讨论】:
不,它无效,可能是因为 ASCII 值从 z 到 A 不连续。
【讨论】: