Regexp для проверки, что строка содержит смешанные символы: 0-n цифр и 0-м букв - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь найти регулярное выражение, которое позволяет мне передать строку, которая имеет 0-n цифр и 0-м строчных букв, где буквы и цифры могут быть смешаны .Любые другие символы не допускаются.Насколько я понимаю, и понятия не имею, как заставить "микшировать" работать

// example n and m values and array with input strings to test
let n=2,m=3; 
let s=["32abc","abc32","a3b2c","3abc2","a2","abcd23","a2b3c4","aa","32","a3b_2c"];

let r=s.map(x=>/[0-9]{2}[a-z]{3}/.test(x));

console.log("curr:", JSON.stringify(r));
console.log("shoud be:   [true,true,true,true,true,false,false,true,true,false]");

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Можно достичь с помощью одного регулярного выражения:

let n=2,m=3; 
let s=["32abc","abc32","a3b2c","3abc2","a2","abcd23","a2b3c4","aa","32", "a3b_2c"];
let rx = new RegExp(
    "^" +                                         // Start of string
    "(?=(?:[^0-9]*[0-9]){0," + n + "}[^0-9]*$)" + // only 0 to n digits
    "(?=(?:[^a-z]*[a-z]){0," + m + "}[^a-z]*$)" + // only 0 to m letters
    "[a-z0-9]*" +                                 // only allow 0 or more letters/digits
    "$"                                           // End of string
);
let r=s.map(x=> rx.test(x));

console.log("current is:", JSON.stringify(r));
console.log("shoud be:   [true,true,true,true,true,false,false,true,true,false]");

См. Демонстрационный пример regex .

Подробности

  • ^ - начало строки
  • (?=(?:[^0-9]*[0-9]){0,2}[^0-9]*$) - положительный прогноз, требующий, чтобы сразу справа от текущего местоположения было от 0 до 2 вхождений любых 0+ символов, кроме цифр, а затем цифры,и затем 0+ символов, отличных от цифр, до конца строки
  • (?=(?:[^a-z]*[a-z]){0,3}[^a-z]*$) - положительный прогноз, который требует, чтобы непосредственно справа от текущего местоположения, было от 0 до 2 вхождений любого 0+символы, кроме строчных букв ASCII, а затем цифра, а затем 0+ символов, кроме строчных букв ASCII, до конца строки
  • [a-z0-9]* - 0 или более строчных букв или цифр ASCII
  • $ - конец строки
0 голосов
/ 11 февраля 2019

Вместо одного RE, рассмотрите возможность проверки букв и цифр отдельно, с глобальным флагом, и проверьте, равна ли длина массива глобального соответствия n и m соответственно:

let n = 2,
  m = 3; // example n and m values
let s = ["32abc", "abc32", "a3b2c", "3abc2", "a2", "abcd23", "a2b3c4", "aa", "32"];


let r = s.map(str => (
  /^[0-9a-z]*$/.test(str) &&
  (str.match(/[0-9]/g) || []).length <= n &&
  (str.match(/[a-z]/g) || []).length <= m
));
console.log("current is:", JSON.stringify(r));
console.log("shoud be:   [true,true,true,true,true,false,false,true,true]");

Или, чтобы быть более многословным, но, возможно, более элегантным, без создания пустого промежуточного массива:

let n = 2,
  m = 3; // example n and m values
let s = ["32abc", "abc32", "a3b2c", "3abc2", "a2", "abcd23", "a2b3c4", "aa", "32"];


let r = s.map((str, i) => {
  const numMatch = str.match(/[0-9]/g);
  const numMatchInt = numMatch ? numMatch.length : 0;
  const alphaMatch = str.match(/[a-z]/g);
  const alphaMatchInt = alphaMatch ? alphaMatch.length : 0;
  return numMatchInt <= n && alphaMatchInt <= m && /^[0-9a-z]*$/.test(str);
});
console.log("current is:", JSON.stringify(r));
console.log("shoud be:   [true,true,true,true,true,false,false,true,true]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...