Возможна ли непрерывная проверка строки с помощью регулярного выражения - PullRequest
2 голосов
/ 14 мая 2019

Я пытаюсь выполнить непрерывную проверку строки, которая также содержит один специальный символ в середине.Непрерывная проверка означает, что даже частичная строка должна возвращать true.

Используя пример строки, такой как [четыре цифры] [дефис] [три алфавитно-цифровых]

Случаи
1) 1 должен подтвердить
2) 432 должен подтвердить
3) 1234- должен подтвердить
4) 1q21- не должен подтвердить
5) 4532-a3s должен подтвердить
6) 8023-as12 не должен проверять

регулярное выражение, которое у меня сейчас есть,

/^([0-9]{1,4})?\-([a-zA-Z0-9]{1,3})?$/;

Это не проверяет случаи 1 и 2 из приведенного выше списка

Это действительно проверяет дело3, 4, 5, 6 сверху дел

Ответы [ 5 ]

1 голос
/ 14 мая 2019

Я бы использовал простой JavaScript для решения этой проблемы.Вы просматриваете каждый символ, проверяете, в какой индексный диапазон они попадают, и соответственно применяете валидацию.

function validateString(str){
   if(str.length > 8 || str.length == 0) return false;
 	for(var i=0;i<str.length;++i){
     	if(i < 4){
         	if(!(str.charAt(i) >= '0' && str.charAt(i) <= '9')) return false;            
        }else if(i == 4){
        	if(str.charAt(i) != '-')  return false;           
        }else{
         	 if(!(str.charAt(i) >= '0' && str.charAt(i) <= '9' || str.charAt(i) >= 'a' && str.charAt(i) <= 'z' || str.charAt(i) >= 'A' && str.charAt(i) <= 'Z')) return false;
        }
    }  
      
    return true;
}
  const tests = [
	'1',
    '432',
    '1234-',
    '1q21-',
    '4532-a3s',
    '8023-as12',
    '1-2a',
    '1234ab',
    '1-a',
    '5555555555555',
    '5555qqq',
    '1234-@#@'
];
  
  
 tests.forEach((value) => {
     console.log(value + " => " + validateString(value));
 });
1 голос
/ 14 мая 2019

Вы можете попробовать

^(\d{1,3}|\d{4}(-[a-z0-9]{0,3})?)$

Regex Demo (пояснения включены)

0 голосов
/ 14 мая 2019

Некоторым трюком может быть использование регулярного выражения только для полной версии, например:

/^\d{4}-[a-zA-Z0-9]{1,3}$/

Иметь полный правильный шаблон:

"1234-aA0"

И выполнять ввод пользователя с правильнойшаблон перед проверкой регулярных выражений:

const detect = function (userInput) {
  if (userInput.length > 8) return false

  const regex = /^\d{4}-[a-zA-Z0-9]{1,3}$/
  const pattern = "1234-aA0"
  
  return regex.test(userInput + pattern.slice(userInput.length))
}

const tests = ['1', '432', '1234-', '1q21-', '4532-a3s', '8023-as12', '1-2a', '1234ab', '1-a', '5555555555555', '5555qqq', '1234-@#@']
  
  
tests.forEach((value) => {
  console.log(value + " => " + detect(value));
});
0 голосов
/ 14 мая 2019

Это не то, в чем регулярные выражения особенно хороши, но ...

^(?:\d{1,3}|\d{4}(?:-([a-zA-Z0-9]{0,3}))?)$

Вы должны постепенно создавать детали, причем полностью удовлетворяемые детали должны быть указаны и обязательны, а неудовлетворенные детали в конце необязательны.

0 голосов
/ 14 мая 2019

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

^(?:\d+|[0-9]{4}-?(?:[a-zA-Z0-9]{1,3})?)$
  • ^ Начало строки
  • (?: Группа без захвата
    • \d+ Совпадение 1+ цифр
    • | или
    • [0-9]{4}-? Совпадение 4 цифр с необязательным -
    • (?: Группа без захвата
      • [a-zA-Z0-9]{1,3} Совпадение с любым из перечисленных в классе персонажей 1 - 3 раза
    • )? Закрыть группу и сделать ее необязательной
  • ) Закрыть группу без захвата
  • $ Конец строки

Regex demo

Если разрешено не более 4 цифр и дефис должен быть во второй части, вы также можете использовать:

^(?:\d{1,4}(?:-[a-zA-Z0-9]{0,3})?|\d{4})$

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...