разрешить только определенные шаблоны с определенными символами regex - javascript - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу метод проверки соответствия ввода либо

>=n, >n, <n, <=n or n..n.

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

Пока я просто проверяю, есть ли в нем эти символы

const text = '>2';
const regex = /^[<>=.0-9]|g/i;
console.log(regex.test(text));

как мне создать регулярное выражение, которое будет толькоразрешить эти конкретные шаблоны / квантификаторы?например.>5 допустимо, но 5> нет.

Какая терминология стоит за этими типами вещей?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

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

После чередования вы можете сопоставить цифру.

^(?:[<>]=?|\d\.\.)\d$

Это будет соответствовать:

  • ^ Начало строки
  • (?: Группа без захвата
    • [<>]=? Совпадение <или> или необязательно =
    • | Или
    • \d\.\. Совпадение цифрыи 2 точки
  • ) Закрыть группу без захвата
  • \d Совпадение с цифрой
  • $ Утверждение конца строки

Regex demo

const strings = [
  ">=3",
  ">3",
  "<2",
  "<=3",
  "5..5",
  "5>"
];
let pattern = /^(?:[<>]=?|\d\.\.)\d$/;
strings.forEach(s => {
  console.log(pattern.test(s));
});
0 голосов
/ 29 ноября 2018

Вы должны учитывать порядок и быть более точным:

^(?:>|<|>=|<=)(?:[1-9]\d*|0)$
  • (?:>|<|>=|<=) - набор допустимых операторов
  • (?:[1-9][0-9]*|0) - число без нуля в начале

Таким образом, полная переменная regex будет инициализирована как:

regex = /^(?:>|<|>=|<=)(?:[1-9]\d*|0)$|g/i;

Вы добавили совпадение n..n в качестве альтернативы.Вот, пожалуйста:

^((>|<|>=|<=)|([1-9]\d*|0)\.\.)([1-9]\d*|0)$
  • \. буквально соответствует точке . и должно быть экранировано

Проверьте это:

regex = /^((>|<|>=|<=)|([1-9]\d*|0)\.\.)([1-9]\d*|0)$|g/i;

array = new Array();

array[0] = ">2";    // valid
array[1] = ">0";    // valid
array[2] = "2..3"   // valid
array[3] = "=2";    // invalid
array[4] = ">01";   // invalid
array[5] = "2>";    // invalid

array.forEach(item => console.log(regex.test(item)));

Если вы не возражаете против начального нуля, просто используйте:

^((>|<|>=|<=)|\d*\.\.)\d*$
0 голосов
/ 29 ноября 2018

Возможно, вы можете использовать ^[<>]=?\d+$

  • ^ совпадение с начала строки
  • [<>] обязательное увеличение или уменьшение знака
  • =? необязательный знак равенства
  • \d+ любое количество цифр
  • $ совпадение до конца строки

Демо

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