我有一个或多或少像这样使用的正则表达式:
'(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
出现,为什么国旗会有所不同?
这是一个小组:
/^(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)
这是因为你的正则表达式从带括号的组开始.将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)