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

jin*_*ula 8 javascript regex

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

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

由于某种原因,这会返回

["(801) 555-1234", undefined]
Run Code Online (Sandbox Code Playgroud)

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

["(801) 555-1234"]
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ry-*_*Ry- 9

这是一个小组:

/^(1[-. ]?)?
Run Code Online (Sandbox Code Playgroud)

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

获取第一个元素:

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

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

/^(?:1[-. ]?)?
Run Code Online (Sandbox Code Playgroud)

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

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

  • 啊! 这完全有道理.数组元素反映所有捕获组(无论它们是否可选).由于第一组未找到匹配,因此该匹配的值未定义.现在你说出来就完全​​有道理了.查看MDN示例,我看到该数组将包含整个正则表达式的匹配以及与捕获组的匹配.谢谢. (3认同)

Poi*_*nty 6

这是因为你的正则表达式从带括号的组开始.将undefined在结果意味着没有符合的那部分.

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

"hello world! nice day today!".match(/\w+/g)
Run Code Online (Sandbox Code Playgroud)

会返回一个这样的数组:

["hello", "world", "nice", "day", "today"]
Run Code Online (Sandbox Code Playgroud)