【问题标题】:How do you read this JavaScript regular expression?你如何阅读这个 JavaScript 正则表达式?
【发布时间】:2008-11-09 05:04:16
【问题描述】:
var pattern = /^0+$/;

我的猜测是这样的:

“查看字符串的开头和结尾,如果开头和结尾有一个或多个零的模式,则返回该模式。”

不过,我确定这是错误的,因为当我使用此字符串运行表达式时:

var string = "0000009000000";

出现null

那么它到底在说什么?当我问的时候,JavaScript 是如何考虑字符串的开头、中间和结尾的?

更新 #1: 感谢您的回复!我想我现在明白了。我的困惑源于我将字符串可视化为具有开头、中间和结尾的事实。像这样:

[开始][中间][结束]

换句话说,对于上面给定的字符串,以下表达式按我的预期工作:

/^0+/; 返回“000000”(字符串开头有一个或多个零的模式)

/0+$/;返回“000000”(字符串末尾有一个或多个零的模式)

更新 #2:我对这一点的所有回复都投了赞成票,因为它们都很有帮助,我将这些答案汇总成一个重要的答案:

给定以下 JavaScript 代码:

var string = "0000009000000";
var regExp = /^0+$/; 
alert(regExp.exec(string));

部分内容如下:

"如果正则表达式中 ^ 修饰符和 $ 修饰符前面的确切字符不是同时位于字符串的第一个位置和字符串的最后一个位置(即,它们不是字符串中唯一的字符),然后返回 null。否则,返回字符。”

换句话说,假设给定的字符串是六个零“000000”。这会导致匹配,因为完全相同的“0”字符组位于第一个位置(1st 2nd 3rd 4th 5th 6th)和最后一个位置(1st 2nd 3rd 4th 5th字符串的第 6 个)。

但是,在原始给定字符串中,有六个零,然后是一个九,然后是六个零(“0000009000000”)。现在,字符串第一个位置的六个零 (1st, 2nd, 3rd, 4th, 5th, 6th) 与字符串最后位置的六个零 (8th, 9th, 10th, 11th, 12th) 不完全相同,第 13 次)。因此,会返回一个null

【问题讨论】:

  • 回复:更新 2. 想太多了。该表达式仅表示“匹配字符串的开头,后跟 1 个或多个 0,然后是字符串的结尾”。不要将 ^ 和 $ 视为位置,而应将其视为(不存在的)开始字符和终止符的匹配器。
  • 也许……但问这个问题让我意识到仅仅知道定义是不够的——我需要“深入了解”并了解定义的原因——这是算法我追! :)

标签: javascript regex


【解决方案1】:

这是说你的字符串只包含 0...它必须开始,然后有 1 个或多个 0,然后结束。

【讨论】:

    【解决方案2】:

    ^0+$

    • 在字符串«^»的开头声明位置
    • 匹配字符“0”的字面意思是«0+»
      • 在一次和无限次之间,尽可能多次,按需回馈(贪婪)«+»
    • 在字符串末尾(或在字符串末尾的换行符之前,如果有的话)断言位置«$»

    【讨论】:

      【解决方案3】:

      如果您希望它与您的字符串匹配,您希望您的正则表达式类似于:

      var pattern = /^0+.*0+$/
      

      这将匹配开头的 1 个或多个“0”,结尾的 1 个或多个“0”,以及中间的 0 个或多个任何内容。

      【讨论】:

      • 认为他想要“以 0 开头或以 0 结尾”......您的开头和结尾都需要 0。
      • 不,他想要“开头和结尾的一个或多个零”
      【解决方案4】:

      至少有一个 0 的模式,锚定在一行的开头 (^) 和结尾 ($);换句话说,字符串由一个或多个零组成。

      要匹配由数字 0 到 9 组成并以至少一个零开头和结尾的字符串,模式

      /^0+[0-9]+0$/
      

      会起作用,即匹配一个或多个零,然后匹配一个或多个数字 0-9,以零结尾。

      除非另有说明,JavaScript 会将整个字符串视为一行,忽略换行符;要强制它考虑多个单独的行,请使用 m 修饰符,例如

      /regex/m
      

      另请参阅: JavaScript regular expression overview on Mozilla Developer Center

      【讨论】:

        【解决方案5】:

        响应您的更新——您说得对。正则表达式将尝试匹配的字符串确实有开头、中间和结尾。

        但是你知道吗?所有字符串都有开头和结尾。

        你的正则表达式说,字符串必须有一个开头,一个结尾,在两者之间只有一个零字符串。

        不要将您的000000 视为开头,或将您的900000 视为结尾。 事实上,暂时忽略开始和结束的想法。

        • 这个正则表达式匹配“必须在某处有一些零”:/0+/
        • 这个正则表达式匹配“其中必须有一些零没有别的/^0+$/

        为什么要添加 ^ 和 $?

        因为“and nothing else”没有正则表达式,所以我们必须指定“字符串开头,一些零,字符串结尾”,这也是同样的事情。

        顺便说一句,你也弄错了:

        如果在开头和结尾有一个或多个零的模式,则返回该模式

        你的正则表达式不会返回“那个模式”,它只会返回true。您需要括号来掌握模式:/^(0+)$/

        【讨论】:

          【解决方案6】:

          @CodeCurious,你仍然让它变得比它需要的更复杂。正则表达式/^0+$/ 仅表示整个字符串由一个或多个零组成。正则表达式提供了很多混淆的机会,所以只要你能找到它,就接受简单。

          【讨论】:

          • 相信我,这不是我第一次被告知我让事情变得比必要的更复杂! :) 但是,说真的,我意识到,这个正则表达式非常简单。但我的大脑需要从更深的层次看它才能真正理解它。
          【解决方案7】:
          /(^0+|0+$)/
          

          【讨论】:

            【解决方案8】:

            我总是将我的正则表达式转化为人类语言,以确保它是我的意思。

            这个:^0+$

            将如下所示:“如果从字符串的开头 (^) 开始,您至少找到一个 (+) 零 (0),直到字符串的结尾 ($) 才发现其他任何内容。”

            请记住,正则表达式基本上是一堆“如果”语句。所以首先,它必须是“真实的”,然后它会返回最好的结果。正则表达式永远不会返回“有点真实”或“大部分真实”的结果。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-02-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              • 2015-05-23
              • 1970-01-01
              相关资源
              最近更新 更多