你如何阅读这个 JavaScript 正则表达式?

5
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”字符组坐落在字符串的第一个位置(第1、2、3 4、5、6)和最后位置(1、2、3 第4、5、6)。

然而,在原始字符串中,有六个零,后面跟着一个九,再后面是六个零(“0000009000000”)。现在,字符串的第一个位置(第1、2、3、4、5、6个)中的六个零与字符串的最后位置(第8、9、10、11、12、13个)中的完全相同的六个零不一样。因此,返回null


1
回复:更新2。过于深思熟虑了。该表达式仅表示“匹配字符串开头,后跟1个或多个0,然后是字符串结尾”。不要将^和$视为位置,而应将它们视为(不存在的)起始字符和终止符的匹配器。 - billjamesdev
也许吧...但是问这个问题让我意识到仅仅知道定义是不够的--我需要深入了解定义背后的原因--我追求的是算法! :) - GR1000
8个回答

10

它表示您的字符串仅包含0... 它必须以0开头,然后有1个或多个0,最后以0结尾。


7

^0+$

  • 在字符串的开头断言位置 «^»
  • 匹配字符“0”字面上的值 «0+»
    • 尽可能多地回溯,必要时进行回溯(贪婪)«+»
  • 在字符串的结尾(或在字符串末尾的换行符之前,如果有的话)断言位置 «$»

2
如果你希望它与你的字符串匹配,那么你需要将正则表达式设置为类似于以下内容: ```html

如果您希望与字符串匹配,则要求您的正则表达式如下:

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

这将匹配开头为1个或多个“0”,结尾为1个或多个“0”,中间为0个或多个任意字符。


他可能想要“以0开头或以0结尾”……而你的要求是在开头和结尾都需要一个0。 - billjamesdev
不是,他想要“一个或多个零在开头和结尾”。 - Nate Parsons

2

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

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

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

需要工作,即匹配一个或多个零,然后是一个或多个数字0-9,以零结尾。

除非另有指示,否则JavaScript将把整个字符串视为一行,忽略换行符;要强制它考虑多个独立的行,请使用m修饰符,例如:

/regex/m

另请参阅: Mozilla 开发者中心上的 JavaScript 正则表达式概述


1

回应您的更新 - 您有点正确。正则表达式将尝试匹配的字符串确实有一个开头,一个中间和一个结尾。

但是,您知道吗?所有字符串都有一个开头和一个结尾。

您的正则表达式表示,该字符串必须具有开头,结尾,并且在两者之间有一串零。

暂时不要考虑起始和结束的概念。

  • 此正则表达式匹配“必须在某个地方有一些零”:/0+/
  • 此正则表达式匹配“必须有一些零而没有其他内容”:/^0+$/

为什么我们要添加^和$?

因为没有“仅此而已”的正则表达式符号,所以我们必须指定“字符串的开头,一些零,字符串的结尾”,这意味着相同的事情。

顺便说一下,您也弄错了:

如果在开头和结尾有一个或多个零的模式,则返回该模式。你的正则表达式不会返回“该模式”,它只会返回true。你需要使用括号来获取该模式:/^(0+)$/。

1
@CodeCurious,你把事情复杂化了。正则表达式/^0+$/仅意味着整个字符串由一个或多个零组成。正则表达式很容易让人感到困惑,所以在你能找到简单方法时就应该接受它。

相信我,这不是我第一次被告知把事情搞得比必要的更复杂了!:) 但是,说真的,我意识到表面上看,这个正则表达式非常简单。但是我的大脑需要从更深层次上看待它,才能真正理解它。 - GR1000

0

我总是将我的正则表达式转换成人类语言,以确保它的意思是我想要的。

这个:^0+$

会被解读为:"如果在我的字符串开头(^)找到至少一个(+)零(0),并且在字符串结尾($)之前没有其他字符。"

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


0
/(^0+|0+$)/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接