你好,我正在尝试编写正则表达式,但遇到了一些问题。有谁能帮我写一个呢。
条件:
• 不允许全部10个数字都是0。
• 区号(前3位数字)不能是相同的数字,
• 第1位和第4位数字不能为0或1。
/^\({0,1}[2-9]{1}[0-9]{2}\){1} {1}[2-9]{1}[0-9]{2}-{0,1}[0-9]{0,4}$/
示例格式:(234)567-7890
与其他问题不同的是,以上问题更侧重于使用正则表达式来满足特定条件。
你好,我正在尝试编写正则表达式,但遇到了一些问题。有谁能帮我写一个呢。
条件:
• 不允许全部10个数字都是0。
• 区号(前3位数字)不能是相同的数字,
• 第1位和第4位数字不能为0或1。
/^\({0,1}[2-9]{1}[0-9]{2}\){1} {1}[2-9]{1}[0-9]{2}-{0,1}[0-9]{0,4}$/
示例格式:(234)567-7890
与其他问题不同的是,以上问题更侧重于使用正则表达式来满足特定条件。
首先,我应该指出需要使用美国电话号码格式相当严格,国际电话号码可能有非常不同的规则。尽管如此,以下正则表达式应该满足您的需求:
/(?:^|\D)\(([2-9])(?:\d(?!\1)\d|(?!\1)\d\d)\)\s*[2-9]\d{2}-\d{4}/
^
)或非数字字符(\D
)。然后是区号的左括号(\(
)。[2-9]
。\d
),后跟除第一个数字外的任何数字((?!\1)\d
),或者反过来((?!\1)\d\d
)。这样可以避免区号是三个相同的数字。\)
),在前缀的第一个数字(再次是[2-9]
)之前允许(但不要求)空格(\s*
),后跟任意两个数字(\d{2}
)、连字符和任意四个数字(\d{4}
)。让我们分开来看,您有三个条件:
如果考虑条件 3,那么条件 1 就是多余的;不考虑条件 2 的简单正则表达式如下:
/^\([2-9]\d\d\) [2-9]\d\d-\d{4}$/
^\(([2-9])(?!\1\1)\d\d\) [2-9]\d\d-\d{4}$
/^\D([2-9])(?!\1\1)\d{2}\D\s+[2-9]\d{2}\s+\W\s+\d{4}$/
input
属性maxlength
设置为10
,利用Array.prototype.map
,Array.prototype.every
。
/*
• ALL 9 digits being 0 is not allowed.
• The area code (first 3 digits) cannot be the same digit,
• The 1st and 4th digit cannot be 0 or 1.
*/
document.querySelector("input").oninput = function(e) {
var vals = this.value.split("");
if (vals.length === 10) {
var all = vals.map(Number).every(function(n) {
return n === 0
})
, area = vals.map(Number).slice(1, 3).every(function(n) {
return n === Number(vals[0]);
})
, numbers = (Number(vals[0]) === (0 || 1)) || (Number(vals[3]) === (0 || 1))
, res = all === area === numbers;
if (!!res) {
alert("invalid entry")
} else {
alert(vals.join(""))
}
}
}
<input type="text" maxlength="10" />
{m,n}
这样的量词应该放在它们所量化的表达式之后。 - Mark Reed'(367) 123 - 4567'.indexOf('0') // -1
你在这个字符串中看到了哪个0
? - Vidul