Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解区号电话的RegExp_Javascript_Regex - Fatal编程技术网

Javascript 理解区号电话的RegExp

Javascript 理解区号电话的RegExp,javascript,regex,Javascript,Regex,我正试图了解更多关于RegExp的电话号码,尤其是区号。通常,区号是这样的: (345)或345中的RegExp代码为: ^(\()?\d{3}(\))?$ 但是有没有办法确保如果键入了(345或345),那么它将不返回匹配或false 我能理解的是: ^$-是字符串的开头和结尾 ()-是第一个捕获的组 \(-在第一个捕获的组中找到,并在字符串中查找“(” ?-我不确定这是什么,但我认为它标志着第一个捕获组的结束 \d{3}-查找数字(数字),但按3位的顺序查找 (\)-第二个捕获组并在字符

我正试图了解更多关于RegExp的电话号码,尤其是区号。通常,区号是这样的:
(345)
345
中的RegExp代码为:

^(\()?\d{3}(\))?$
但是有没有办法确保如果键入了
(345
345)
,那么它将不返回匹配或false

我能理解的是:

  • ^$-是字符串的开头和结尾
  • ()
    -是第一个捕获的组
  • \(
    -在第一个捕获的组中找到,并在字符串中查找“(”
  • -我不确定这是什么,但我认为它标志着第一个捕获组的结束
  • \d{3}
    -查找数字(数字),但按3位的顺序查找
  • (\)
    -第二个捕获组并在字符串中查找“)”

总之,我要求解释
,以及在测试
(345
345)
时如何不返回匹配。

除了字符
未用于标记捕获组的结束外,您对所有内容都是正确的。它实际上是一个特殊的量词字符,表示捕获组
(\()
必须匹配零个或多个字符

解决括号问题的最佳方法是使用Tom建议的
运算符

例如:

^(\(\d{3}\)|\d{3})$

这将在两个表达式中查找匹配项,以便您可以确保包含两个括号或没有括号。

除了字符
不用于标记捕获组的结尾之外,其他所有内容都是正确的。它实际上是一个特殊的量词字符,表示捕获组
(\()
必须匹配零个或多个字符

解决括号问题的最佳方法是使用Tom建议的
运算符

例如:

^(\(\d{3}\)|\d{3})$

这将在这两个表达式中查找匹配项,以便您可以确保包含两个括号或没有括号。

不是最优雅的,只是将两个正则表达式组合在一起

^(\(\d{3}\))$|^(\d{3})$

不是最优雅的,只是结合了两个正则表达式

^(\(\d{3}\))$|^(\d{3})$

下面是一个可能的解决方案

简单的正则表达式来测试包装在a()中的3个数字,如果删除其中一个braket,代码返回false

var str = "(345)"
var patt = /^\(\d{3}\)$/g;
var result = patt.test(str);
console.info(res)

下面是一个可能的解决方案

简单的正则表达式来测试包装在a()中的3个数字,如果删除其中一个braket,代码返回false

var str = "(345)"
var patt = /^\(\d{3}\)$/g;
var result = patt.test(str);
console.info(res)

使regex中的前一个标记成为可选标记。 您应该将其取出以强制插入括号,但由于您还需要匹配不带括号的区号,因此可以使用
|
指定OR大小写

生成的正则表达式如下所示

^(\()\d{3}(\)\d{3})$

如果您不需要捕捉括号本身,则可以将其简化为:

^(\(\d{3}\)\d{3})$

let r=/^(\(\d{3}\)\d{3})$/
console.log(r.test('555'))//true
console.log(r.test('(555)')//true
console.log(r.test('(555'))//false

console.log(r.test('555')//false
这个
使得regex中的前一个标记是可选的。 您应该将其取出以强制插入括号,但由于您还需要匹配不带括号的区号,因此可以使用
|
指定OR大小写

生成的正则表达式如下所示

^(\()\d{3}(\)\d{3})$

如果您不需要捕捉括号本身,则可以将其简化为:

^(\(\d{3}\)\d{3})$

let r=/^(\(\d{3}\)\d{3})$/
console.log(r.test('555'))//true
console.log(r.test('(555)')//true
console.log(r.test('(555'))//false

console.log(r.test('555')//false
?-表示前一个符号不是必须的
表示“零或前一个标记之一”。因此
(\()?
将匹配
”(“
)或
(一个空字符串)。我明白了!非常感谢!为什么不这样做:
^(\(\d{3})\d{3})$
--这是说:
“ddd”或“ddd”
(其中
d
是任何数字)。是否有任何特殊原因需要捕获括号??-表示上一个符号不是必须的
表示“零或上一个标记之一”。因此
(\()?
将匹配
”(
)或
(空字符串)。我明白了!非常感谢!为什么不直接这样做:
^(\(\d{3}\)\d{3})$
——这是说:
“(ddd)”或“ddd”
(其中
d
是任意数字)。有什么特别的原因需要捕获括号吗?问题不是阻止
345
上的匹配!!而是强制使用2个括号或0个括号,而不是1个括号。嗯…
345
只是我键入的随机数。因此,我必须将
345
替换为
\d{3}
,对吗?@KristinaBressler不,我误解了。如果你用
\d{3}
替换
345
,你将无法匹配任何3个数字组合。我想你最好的办法是按照汤姆的建议使用
运算符:
^(\(\d{3})\d{3})$
问题不在于防止在
345
上进行匹配!!问题在于强制使用2个括号或0个括号,而不是1个括号。嗯…
345
只是我键入的随机数。因此,我必须将
345
替换为
\d{3}
,对吗?@KristinaBressler不,我误解了。如果你用
\d{3}
替换
345
,你将无法匹配任何3个数字组合。我想你最好的办法是按照汤姆的建议使用
运算符:
^(\(\d{3})\d{3})$
你通过FreeCodeCamp了吗?我还没有看过这个挑战,所以我不知道它是否满足要求。这只是一个使用regex检测电话号码的基本方法的示例,但你可能还有很多东西可以合作