有关使用正则表达式的问题

时间:2018-06-21 21:28:06

标签: regex

我正试图了解有关正则表达式的更多信息,但遇到了麻烦

我当前的查询:

function telephoneCheck(str) {
 return str.match(/[0-9]{3}[-][0-9]{3}[-][0-9]{4}/g)? true : false
}

这仅适用于诸如"555-555-5555"之类的特定输入,而不适用于诸如"1 (555) 555-5555"之类的其他输入。我不知道如何查询可选字符和空格。此外,括号处理很奇怪,我发现了一些疯狂的查询,例如/(\d+-)\1\d{4}/g,但我不知道它在做什么,并且我不想使用我不理解的代码。

有人可以向我显示一个查询来解决“ 1(555)555-5555”的问题,其中前两个字符(一个和一个空格)是可选输入吗?

这些是正则表达式应该能够处理的输入:

“ 1(555)555-5555”

“ 1(555)555-5555”

“ 1 555-555-5555”

“ 555-555-5555”

“(555)555-5555”

“ 5555555555”

我找到了解决方法

regex: function telephoneCheck(str) {
   var regex = /^(1\s?)?(\(\d{3}\)|\d{3})[\s\-]?\d{3}[\s\-]?\d{4}$/;
   return regex.test(str);
}
telephoneCheck("555-555-5555");

但是我不知道这里发生了什么。如果有人可以解释发生了什么,我很乐意为您提供这个已发布问题的答案:)

1 个答案:

答案 0 :(得分:1)

您一直对尝试将所有内容都包含在正则表达式中保持警惕,并质疑为什么数据首先如此多变。

例如,如果您只是解析一堆您认为应该是电话号码的内容,并且注意到许多不同的格式,那么使用逻辑实际上可能更易读。

执行上述操作可能是一种非常聪明的方法,但是在需要更多内容之前,我对正则表达式的使用会更加粗暴。

以下内容将两种模式组合到一个正则表达式中。您使用|分隔符说or。同样,如果您的字符串与您说的完全一样,则应使用^(以开头)和$以确保您不会得到误报。

var pattern = /^[0-9] \([0-9]{3}\) [0-9]{3}-[0-9]{4}$|^[0-9]{3}[-][0-9]{3}[-][0-9]{4}$/

pattern.test('555-555-5555') //true
pattern.test('1 (555) 555-5555') // true
pattern.test('(555) 555-5555') // false

正如我所说的,如果您有很多不同的格式。质疑为什么,有一种方法可以首先清理。然后也许使用逻辑和单独的语句。

var parensPattern = /^[0-9] \([0-9]{3}\) [0-9]{3}-[0-9]{4}$/
var noParensPattern = /^[0-9]{3}[-][0-9]{3}[-][0-9]{4}$/
if(parensPattern.test('1 (555) 555-5555')) {
     // do something
} else if (noParensPattern.test('555-555-5555)) {
     // do something
}

查看http://regex101.com,这是很棒的资源。