【问题标题】:Typescript - Validate with a list of alternations as text is entered in a text boxTypescript - 在文本框中输入文本时使用替换列表进行验证
【发布时间】:2019-03-01 03:34:55
【问题描述】:

我想在用户输入时检查有效的手机号码 它应该以 04 开头,后跟数字或 应该以 +61 开头,后跟数字

但是验证应该在用户输入时进行,如果用户遵循正确的顺序,它不应该抱怨。例如:用户可以只输入 0.. 它应该仍然匹配,但不应该在接下来输入除 '4' 之外的任何其他数字时匹配。

我正在使用以下正则表达式,但问题是它会验证“0”、“04”以及“4”

^(0?4?)|(+?6?1?)

regexr.com/49bj4

【问题讨论】:

    标签: javascript regex typescript


    【解决方案1】:

    https://regex101.com/r/seh5w4/4

    ^((04)|(0)|(\+61)|(\+6)|(\+))(?(2)(\d{0,6}))(?(3)((?(?=4)4\d{0,6})))(?(4)(\d{0,6}))(?(5)((?(?=1)1\d{0,6})))(?(6)((?(?=61)61\d{0,6})))$
    

    ^((04)|(0)|(\+61)|(\+6)|(\+))  does it start with one of these these
    
    (?(2)(\d{0,6}))  if there is a group 2 (04) is it followed by 0-6 digits
    
    (?(3)((?(?=4)4\d{0,6}))) if group 3 (0) is it followed by a 4, if so is that 4 followed by 0-6 digits
    
    (?(4)(\d{0,6})) if group 4 (+61) is it followed by 0-6 digits
    
    (?(5)((?(?=1)1\d{0,6}))) if group 5 (+6) is it followed by a 1, if so is that 1 followed by 0-6 digits
    
    (?(6)((?(?=61)61\d{0,6}))) if group 6 (+), is it followed by 61, if so is that 61 followed by 0-6 digits
    

    我使用了 6 位数字,您应该将其更改为 04 或 +61 之后允许的最大位数。

    我这样做是为了如果您使用的位数超过最大位数,它将不匹配。

    我相信它可以在您根据需要键入每个字符时起作用。 (您没有指出允许数字集之间有空格,但这可能会被修改以处理。)

    鉴于正则表达式的复杂性,我不确定我是否真的推荐使用这种方法......

    【讨论】:

    • switch (number.length) { case 0: { return true; } case 1: { return number.startsWith("0") || number.startsWith("+"); } 案例 2: { 返回 number.startsWith("04") || number.startsWith("+6"); } 案例 3: { 返回 number.startsWith("04") || number.startsWith("+61"); } 案例 4:默认值:{ 返回 number.startsWith("04") || number.startsWith("+614"); } } }
    【解决方案2】:

    你的正则表达式的问题是?

    使前面的量词变得惰性,使其匹配尽可能少的字符。默认情况下,量词是贪婪的,会匹配尽可能多的字符。

    试试这个/^04\d+|\+61\d+/:

    ^04(字符串)开头,后跟数字\d+,另一个相同。

    const a = /^04\d+|\+61\d+/g.test('+61938272')
    const b = /^04\d+|\+61\d+/g.test('+71938272')
    const c = /^04\d+|\+61\d+/g.test('04938272')
    const d = /^04\d+|\+61\d+/g.test('+41938272')
    const e = /^04\d+|\+61\d+/g.test('051938272')
    const f = /^04\d+|\+61\d+/g.test('451938272')
    
    console.log({a, b, c, d, e, f});

    【讨论】:

    • 只有 +6 会发生什么?它也应该是有效的。
    【解决方案3】:

    您应该为您的用例使用 2 个正则表达式。

    一个用于在输入时进行验证,另一个用于在您提交或关注输入时进行验证。

    输入时:^((04?)|(\+((61?)?)?)|(?!.))

    提交时:^(04|\+61)[0-9]+

    【讨论】:

    • 输入时一个表达式不起作用。在这种情况下,您需要一个长度至少为 4 的表达式。
    【解决方案4】:

    试试这个:

    var patt = /^((0(4\d*)?)|(\+(6(1\d*)?)?)?)*$/ ;
    

    var patt = /^((0(4\d*)?)|(\+(6(1\d*)?)?)?)*$/ ;
    
    console.log('0 ==>',patt.test('0') );
    console.log('04 ==>',patt.test('04') );
    console.log('4 ==>',patt.test('4') );
    
    console.log('+6 ==>',patt.test('+6') );
    console.log('067 ==>',patt.test('+67') );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      相关资源
      最近更新 更多