为什么javascript字符串匹配包括undefined

时间:2014-01-09 16:43:18

标签: javascript regex

我有一个或多或少像这样使用的正则表达式:

'(801) 555-1234'.match(/^(1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/)

出于某种原因,这会返回

["(801) 555-1234", undefined]

如果我将全局标志添加到正则表达式(例如...{4}$/g),则未定义的值会丢失并且我得到

["(801) 555-1234"]

如果没有必要,我宁愿不使用g标志(在我看来它不是,因为正则表达式以^开头并以$结尾)。

P.S。忽略正则表达式的质量,因为它的目的是匹配电话号码。它可能不太理想,但是来自我维护的代码。大多数情况下,我对^ ... $以及标志的存在/不存在以及未定义的值感兴趣。

为什么undefined会出现,为什么国旗会有所不同?

4 个答案:

答案 0 :(得分:8)

这是一个小组:

/^(1[-. ]?)?

.match(没有/g标志)和.exec返回组作为数组的一部分。如果该组不匹配,则其值设置为undefined

获取第一个元素:

'(801) 555-1234'.match(/^(1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/)[0]

如果你真的,真的,真的想要单元素数组由于某种原因,你可以使它不捕获:

/^(?:1[-. ]?)?

然而,此时,您将此正则表达式锚定到字符串的开头和结尾,并且不提取任何信息。在这种情况下,您似乎真的在寻找RegExp.prototype.test

var PHONE_NUMBER = /^(1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/;
var isValid = PHONE_NUMBER.test('(801) 555-1234');

答案 1 :(得分:5)

这是因为你的正则表达式从带括号的组开始。结果中的undefined表示没有任何内容与该部分匹配。

当您添加“g”后缀时,正则表达式代码的行为会稍微改变,因此返回值会有所不同。 “g”(“全局”)后缀使例程返回整个正则表达式的所有匹配项;在这种情况下,这些组被有效地忽略了。例如:

"hello world! nice day today!".match(/\w+/g)

将返回如下数组:

["hello", "world", "nice", "day", "today"]

答案 2 :(得分:3)

您有一个捕获的子模式:(1[-. ]?)?

这是可选的。

在这种情况下,选项是不匹配。

因此,它是未定义的。

尝试使用非捕获子模式:(?:1[-. ]?)?

答案 3 :(得分:2)

在你的正则表达式中(1[-. ]?)?表示

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1 (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
  1                        '1'
--------------------------------------------------------------------------------
  [-. ]?                   any character of: '-', '.', ' '
                           (optional (matching the most amount
                            possible))
--------------------------------------------------------------------------------
  )?                       end of \1 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \1)

enter image description here

并尝试(?:1[-. ]?)?

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
   1                       '1'
--------------------------------------------------------------------------------
  [-. ]?                   any character of: '-', '.', ' '
                           (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  )?                       end of grouping

enter image description here