【问题标题】:Is the regular expression [a-Z] valid and if yes then is it the same as [a-zA-Z]?正则表达式 [a-Z] 是否有效,如果是,那么它是否与 [a-zA-Z] 相同?
【发布时间】: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


    【解决方案1】:

    不,a (97) 高于 Z (90)。 [a-Z] 不是有效的字符类。然而[A-z] 也不等同,但出于不同的原因。它将覆盖所有字母,但也包括大小写字母之间的字符:[\]^_`

    【讨论】:

    • 是的,它是... [a-Z] 无效,因为 Z 出现在 a 之前
    • 我解释了为什么[a-Z][A-z] 都无效。不要因为我做了额外的功劳而对我投反对票。 :-)
    • 我不确定正则表达式是否仅用于 ASCII。难道这也取决于编码和排序规则吗?
    • [a-Z] 在 C 语言环境中无效,是的。在该语言环境中,编码字符的数值就是顺序。但这不适用于许多其他语言环境(例如 en_US.utf8)。在该语言环境中,[a-Z] 表示现有的排序规则,因此是有效的。此外,它代表了 ASCII 范围内的所有大写和小写字母。
    • 参考操作员的问题,这里很容易找到最佳答案。如果可能在使用的库/语言变体中(例如 /[a-z]/i(?i)[a-z]),可能还值得添加关于使正则表达式不区分大小写以帮助比这些简单示例更复杂的任何内容的可读性的建议
    【解决方案2】:

    我不确定其他语言的实现,但在 PHP 中你可以做到

    "/[a-z]/i"
    

    并且它不区分大小写。其他语言可能也有类似的东西。

    【讨论】:

    • PHP 的大部分特性都来自 Perl,包括这个。 (PHP 以前是用 Perl 编写的。实际上其中一个 P 曾经代表 Perl)
    【解决方案3】:

    您没有指定什么语言,但通常[a-Z] 不是有效范围,因为在 ASCII 中,小写字母字符位于大写字母字符之后[A-z] 可能 是一个有效范围(表示所有大写和小写字母以及出现在Za 之间的标点符号),但可能不是,具体取决于您的特定实施。 i 标志可以添加到正则表达式中,使其不区分大小写;检查您的特定实现以获取有关如何指定该标志的说明。

    【讨论】:

      【解决方案4】:

      您可以随时尝试:

       print "ok" if "monkey" =~ /[a-Z]/;
      

      Perl 说

      正则表达式中的 [] 范围“a-Z”无效;由

      【讨论】:

      • 正是我所说的。我最喜欢的说法是“try it 'n c”,因为如果你当时碰巧在用 C 语言开发,它有两个含义。
      • 我不喜欢“试试看”,因为如果他尝试过[A-z],则不会出现错误消息,但它也不会正常工作。
      • 这是因为在 ASCII 中,大写在前。因此,[A-z] 有效,但 [a-Z] 无效。
      • 但他没有问这个问题。问题很清楚。为什么要故意曲解呢?
      【解决方案5】:

      如果它是有效的,它不会做你所期望的。

      Z的字符代码低于a的字符代码,因此如果将代码交换为[Z-a]的范围,它将与[Z\[\\\]^_`a]相同,即包含字符Za,以及它们之间的字符。

      如果你使用[A-z]获取所有大小写字符,那还是和[A-Za-z]不一样,和[A-Z\[\\\]^_`a-z]一样。

      【讨论】:

        【解决方案6】:

        我刚刚在一个脚本(不是我自己的)中遇到了这个问题。

        似乎 grep、awk、sed 接受 [a-Z] 取决于您的语言环境(即 LANG 或 LC_CTYPE 环境变量)。在 POSIX 中,这些工具不允许 [a-Z],但在其他一些语言环境(例如 en_gb.utf8)中它可以工作,并且与 [a-zA-Z] 相同。

        是的,我已经检查过了,它与 _^[]` 中的任何一个都不匹配。

        鉴于调试需要相当长的时间,我强烈反对任何人在正则表​​达式中使用 [a-Z]

        【讨论】:

          【解决方案7】:

          不,它无效,可能是因为 ASCII 值从 z 到 A 不连续。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-11
            • 1970-01-01
            • 1970-01-01
            • 2011-06-22
            • 1970-01-01
            • 2018-08-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多