Typescript - проверка со списком изменений, когда текст вводится в текстовое поле - PullRequest
0 голосов
/ 01 марта 2019

Я хочу проверить действительный номер мобильного телефона, когда пользователь вводит его. Он должен начинаться с 04, затем цифрами или должен начинаться с +61, а затем цифрами

Но проверка должна происходить при вводе пользователеми если пользователь следует правильной последовательности, он не должен жаловаться.Например: пользователь может набрать только 0 .. и он все равно должен совпадать, но не должен, как только будет введена любая другая цифра, кроме «4».

Я использую следующее регулярное выражение, но проблемапри этом он будет проверять '0', '04', а также просто '4'

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

regexr.ком / 49bj4

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Попробуйте:

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') );
0 голосов
/ 01 марта 2019

Вы должны использовать 2 регулярных выражения для вашего варианта использования.

Один для проверки при вводе и другой, когда вы отправляете или фокусируете свой ввод.

При вводе: ^((04?)|(\+((61?)?)?)|(?!.))

При отправке: ^(04|\+61)[0-9]+

0 голосов
/ 01 марта 2019

См. 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.

Я сделал так, чтобы оно не совпадало, если бы вы использовали больше максимального числа цифр.

Я считаю, что это работает, когда вы печатаете каждый символ так, как вам хочется.(Вы не указали разрешить пробелы между наборами чисел, но, вероятно, это можно изменить, чтобы справиться с этим.)

Учитывая сложность регулярного выражения, я не уверен, что на самом деле рекомендую использовать этот подход ...

0 голосов
/ 01 марта 2019

проблема с вашим регулярным выражением: ?

Делает предыдущий квантификатор ленивым, заставляя его соответствовать как можно меньшему количеству символов.По умолчанию квантификаторы являются жадными и будут соответствовать как можно большему числу символов.

попробуйте этот /^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});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...