我有一个或多或少像这样使用的正则表达式:
'(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
会出现,为什么国旗会有所不同?
答案 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)
并尝试(?: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