regex 正则表达式的电话号码和一个潜在的拼写出来的电话号码?

idfiyjo8  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(133)

正则表达式应匹配潜在的国家代码前缀(即+1)、数字、拼写出的数字以及以下任何潜在的分隔符:第一个月第一个月,第一个月第二个月,第一个月第三个月,第一个月第四个月,第一个月第五个月,第一个月第六个月,第一个月第七个月,第一个月第八个月
我知道网上有数以千计的电话号码正则表达式解决方案,但我的研究还没有给我带来一个解决问题的方案。
我需要一个正则表达式来验证一个输入字符串,该字符串可能包含一个电话号码,可能以国家代码为前缀。这个正则表达式还应该匹配任何可能拼写出的数字。
下面是一些应该匹配的明显候选项:

+18881234567
+3748881234567 // Armenia
18881234567
8881234567
+1888-123-4567
+1888-123-45-6-7
+18.88.123-45-6-7
8|88.123-45|6|7
+1888     1234567
+1888-   1234567

这一部分相对简单,我目前遇到的唯一问题是处理所有可能的分隔符类型,现在,我只查找-.|
另一位是拼写出来的数字,正则表达式也应该匹配(这是我唯一能想到的):

a1888a123a4567
+1eight8eight1two345six7
8eight81234five67
8(eight)81234(five)67
8(eight-)81234(-five)67

我不知道如何解析正则表达式,我也无法在网上找到任何东西。
有什么能与这些变异相匹配?

9jyewag0

9jyewag01#

我不相信你可以用一个正则表达式 * 和 * 来验证这样的输入,因为如果你允许输入包含'eight'这样的字符串,你可能还需要把它翻译成'8',所以我将按照如下方式进行:
1.首先将输入转换为小写,这样就不必担心“eight”、“Eight”、eighT“等变体。
1.用“1”替换出现的“one”,用“2”替换出现的“two”,依此类推。
1.删除任何非数字的内容。
1.测试结果字符串是否至少包含一个数字(即长度〉= 1)。您可能对位数有特定的规则,但尚未指定这些规则。
如果我上面的假设不正确,因为你似乎允许任意的分隔符和字母字符串,你实际上允许任何东西,只要输入包含至少一个数字,在这种情况下,你只需要检查/[0-9]|one||two|etc./i
否则:

const tests = `+18881234567
+3748881234567 // Armenia
18881234567
8881234567
+1888-123-4567
+1888-123-45-6-7
+18.88.123-45-6-7
8|88.123-45|6|7
+1888     1234567
+1888-   1234567
a1888a123a4567
+1eight8eight1two345six7
8eight81234five67
8(eight)81234(five)67
8(eight-)81234(-five)67`.split('\n');

for (const original of tests) {
    let s = original.toLowerCase();
    s = s.replace('one', '1').
        replace('two', '2').
        replace('three', '3').
        replace('four', '4').
        replace('five', '5').
        replace('six', '6').
        replace('seven', '7').
        replace('eight', '8').
        replace('nine', '9').
        replace('zero', '0');
    s = s.replace(/[^0-9]/g, '', s);
    if (s === '') {
        console.log(original + ' not valid');
    }
    else {
        console.log(original +  ' -> ' + s);
    }
}

相关问题