我对正则表达式的技能较少,我有一个快速的问题。我需要使用regEx验证电话号码输入。
解释/表达将不胜感激。电话号码可以是以下任何一种格式:
(94) 123 345
(94).456.7899
(94)-456-7899
94-456-7899
+94 456 7899
94 456 7899
0094 456 7899
(94) 123
122 3454
1223454
1)数字可以包含空格和字符,也可以不包含字符。
2)它必须至少包含5位数字,且没有空格和字符。(我此时停留在此位置)
第一次尝试
export const basicPhoneNumber = value =>
value && !/^\+?\d+$/i.test(value)
? 'Invalid phone number'
: undefined;
第二次尝试
export const basicPhoneNumber = value =>
value && !/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4,})/i.test(value)
? 'Invalid phone number'
: undefined;
非常感谢您的帮助,并祝您一切顺利!
答案 0 :(得分:2)
使用正则表达式进行电话号码验证非常复杂,尤其是在这种情况下,但是我们可以尝试使用类似于以下内容的表达式:
^\+?\(?([0-9]{2,4})[)\s.-]+([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$
这可能会因未列出的某些所需实例而失败,不管某些输入(例如(000)000-0000)不是真正的电话号码。
const regex = /^\+?\(?([0-9]{2,4})[)\s.-]+([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$/gmi;
const str = `(94) 123 345
(94).456.7899
(94)-456-7899
94-456-7899
+94 456 7899
94 456 7899
0094 456 7899
(94) 123
122 3454`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
要允许12234554
,我们将为([)\s.-]+)?
创建一个可选组,
^\+?\(?([0-9]{2,4})([)\s.-]+)?([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$
答案 1 :(得分:2)
如果您要做的只是按照列出的条件验证电话号码,则可以考虑先去除所有非数字字符,然后使用RegExp进行测试。
不仅容易得多,而且易于理解。
// Sample data
const numbers = [
'(94) 123 345',
'(94).456.7899',
'(94)-456-7899',
'94-456-7899',
'+94 456 7899',
'94 456 7899',
'0094 456 7899',
'(94) 123',
'122 3454'
]
// The validation function
const validate = value => {
value = value.replace(/\D|(^0+)/g, '');
return /^\d{5,}$/.test(value);
}
// Tests
numbers.forEach(function(phone){
console.log(validate(phone), `"${phone}"`);
});
/\D|(^0+)/g
\D
匹配所有非数字字符。(^0+)
在至少有1个开头的0个字符时匹配。 /^\d{5,}$/
当字符串以数字开头和结尾以及字符串由至少5个数字组成且没有任何非数字时匹配。