Отфильтровать выражение из соответствия регулярному выражению - PullRequest
0 голосов
/ 26 сентября 2018

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

("(?!([1-9]{1}[0-9]*)-(([1-9]{1}[0-9]*))-)^(([1-9]{1}[0-9]*)|(([1-9]{1}[0-9]*)( |-|( ?([1-9]{1}[0-9]*))|(-?([1-9]{1}[0-9]*)){1})*))$")

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

Две черты, разделяющие 3 целых числа, недопустимы, даже если они имеют целые числа с обеих сторон, например (integer)(dash)(integer)(dash)(integer).

Если тире являетсяпоследний символ ввода, которому предшествует целое число, это допустимый ввод, такой как (integer)(dash)(end of the string).

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

Чтобы дать суть, эти черточки используются в моей входной строке для обеспечения диапазона.Некоторыми примерами выражений, которые я хочу отфильтровать, являются

1-5-10, 1 - 5 - 10, 1 - - 5, -5

Обновление - Есть некоторые правилакоторый будет вести входную строку.Моя задача - убедиться, что я разрешаю только те входные строки, которые соответствуют формату.Правила для формата -1. Числа, разделенные пробелом ('').Но штриховая линия не должна иметь пробела.Например, «10 20-30» или «10 20-30» - все допустимые значения.2. Штриховая линия ('-') используется для установки диапазона (от, до).Он также может использоваться для установки конца списка заданий.Например, «100-150 200-250 300-» является допустимым значением.3. Штриховая линия без номера стартового задания не допускается.Например, «-10» не допускается.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете использовать:

^(?:(?:[1-9][0-9]*[ ]?-[ ]?[1-9][0-9]*|[1-9][0-9]*)(?: (?:[1-9][0-9]*[ ]?-[ ]?[1-9][0-9]*|[1-9][0-9]*))*(?: [1-9][0-9]*-)?|[1-9][0-9]*-?)[ ]*$

Regex demo

Объяснение

  • ^ Утверждение начала строки
  • (?: Группа без захвата
    • (?: Группа без захвата
      • [1-9][0-9]*[ ]?-[ ]?[1-9][0-9]* Номер совпадения> 0, необязательнопробел, тире, необязательный пробел и число> 0. Пробел в классе символов [ ] для наглядности .
      • | Или
      • [1-9][0-9]* Номер матча> 0
    • ) Закрыть группу без захвата
    • (?:[ ] Группа без захвата, за которой следует пробел
      • (?: Негруппа захвата
        • [1-9][0-9]*[ ]?-[ ]?[1-9][0-9]* Номер совпадения> 0, необязательный пробел, тире, необязательный пробел и номер> 0.
        • | Или
        • [1-9][0-9]*Номер совпадения> 0
      • ) закрыть группу без захвата
    • )* закрыть группу без захвата и повторить ноль или более раз
    • (?: [1-9][0-9]*-)? Необязательная часть, которая соответствует пробелу с последующим номером> 0
    • | или
    • [1-9][0-9]*-? Соответствует номеру> 0, за которым следует дополнительная тире
  • ) закрыть группу без захвата
  • [ ]*$ Сопоставьте ноль или более раз с пробелом и подтвердите конец строки

Примечание Если вы хотите сопоставить ноль или более раз с пробеломвместо необязательного пробела вы можете обновить [ ]? до [ ]*.Вы можете написать [1-9]{1} как [1-9]

0 голосов
/ 26 сентября 2018

После обновления вопрос стал довольно сложным.Так как некоторые части регулярного выражения используются многократно, я взял на себя смелость проработать это в Ruby и впоследствии очистил его.Я покажу вам процесс сборки, чтобы можно было понять регулярное выражение.Ruby использует #{variable} для регулярного выражения и интерполяции строк.

integer = /[1-9][0-9]*/
integer_or_range = /#{integer}(?: *- *#{integer})?/
integers_or_ranges = /#{integer_or_range}(?: +#{integer_or_range})*/
ending = /#{integer} *-/
regex = /^(?:#{integers_or_ranges}(?: +#{ending})?|#{ending})$/
#=> /^(?:(?-mix:(?-mix:(?-mix:[1-9][0-9]*)(?: *- *(?-mix:[1-9][0-9]*))?)(?: +(?-mix:(?-mix:[1-9][0-9]*)(?: *- *(?-mix:[1-9][0-9]*))?))*)(?: +(?-mix:(?-mix:[1-9][0-9]*) *-))?|(?-mix:(?-mix:[1-9][0-9]*) *-))$/

Очистка вышеприведенных листьев регулярного выражения:

^(?:[1-9][0-9]*(?: *- *[1-9][0-9]*)?(?: +[1-9][0-9]*(?: *- *[1-9][0-9]*)?)*(?: +[1-9][0-9]* *-)?|[1-9][0-9]* *-)$

Вы можете заменить [0-9] на \d, если хотите,но так как вы использовали синтаксис [0-9] в своем вопросе, я использовал его и для ответа.Имейте в виду, что если вы замените [0-9] на \d, вам придется избежать обратной косой черты в строковом контексте.например."[0-9]" равно "\\d"

Вы упоминаете в своем вопросе, что

Любой из вышеупомянутых форматов может иметь пробелы между ними.

Я предположил, что это означает, что пробелы (и) не допускаются до или после фактического содержимого, только между целыми числами и -.

  • Действительный:

    15 - 10

    1234 -

  • Недействительно:

    15 - 10

    123

Если это не так, просто добавьте * в начало и конец.

^ *... *$

Где ... - остаток регулярного выражения.

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

var
inputs = [
  '1-5-10',
  '1 - 5 - 10',
  '1 - - 5',
  '-5',
  '15-10',
  '15 - 10',
  '15      -          10',
  '1510',
  '1510-',
  '1510       -',
  '1510    ',
  '   1510',
  '  15 - 10',
  '10 20 - 30',
  '10 20-30',
  '100-150 200-250 300-',
  '100-150 200-250 300- ',
  '1-2526-27-28-',
  '1-25 26-2728-',
  '1-25 26-27 28-',
],

regex = /^(?:[1-9][0-9]*(?: *- *[1-9][0-9]*)?(?: +[1-9][0-9]*(?: *- *[1-9][0-9]*)?)*(?: +[1-9][0-9]* *-)?|[1-9][0-9]* *-)$/,

logInputAndMatch = input => {
  console.log(`input: "${input}"`);
  console.log(input.match(regex))
};

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