Подтвердить что ты не робот

Regex ровно n OR m раз

Рассмотрим следующее регулярное выражение, где X - любое регулярное выражение.

X{n}|X{m}

Это регулярное выражение будет проверять на X в точности n или m раз.

Есть ли квантификатор регулярных выражений, который может проверить наличие X точно n или m раз?

4b9b3361

Ответ 1

Нет единого квантификатора, который означает "точно m или n раз". То, как вы это делаете, прекрасно.

Альтернативой является

X{m}(X{k})?

где m < n и k - значение n-m.

Ответ 2

Вот полный список квантификаторов (ссылка http://www.regular-expressions.info/reference.html):

  • ?, ?? - 0 или 1 вхождения (?? ленив, ? является жадным)
  • *, *? - любое количество входов
  • +, +? - по крайней мере одно появление
  • {n} - точно n вхождения
  • {n,m} - n до m вхождения, включительно
  • {n,m}? - n to m вхождения, ленивые
  • {n,}, {n,}? - не менее n вхождения

Чтобы получить "точно N или M", вам нужно написать квантифицированное регулярное выражение дважды, если только m, n не являются специальными:

  • X{n,m} если m = n+1
  • (?:X{n}){1,2}, если m = 2n
  • ...

Ответ 3

Нет, такого квантификатора нет. Но я реструктурировал его до /X{m}(X{m-n})?/, чтобы предотвратить проблемы в обратном направлении.

Ответ 4

TL;DR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

Похоже, вы хотите "x n раз" или "x m раз", я думаю, что буквальный перевод в regex будет (x{n}|x{m}). Как https://regex101.com/r/vH7yL5/1

или, в случае, если вы можете иметь последовательность больше, чем m "x" s (при условии m > n), вы можете добавить 'follow no "x" ' и 'follow after no "x", переводя на [^x](x{n}|x{m})[^x], но это предполагает, что всегда есть символ и после вас "x". Как вы можете видеть здесь: https://regex101.com/r/bB2vH2/1

вы можете изменить его на (?:[^x]|^)(x{n}|x{m})(?:[^x]|$), переведя на "follow no" x "или после начала строки" и "за ним следует" x "или за ним следует конец строки". Но все же он не будет соответствовать двум последовательностям с одним символом между ними (потому что для первого совпадения потребуется символ после, а второй - символ раньше), как вы можете видеть здесь: <а2 >

Наконец, чтобы соответствовать удалению в один символ, вы можете добавить положительный взгляд вперед (? =) на "нет" x "после" или положительный внешний вид (? < =) на "нет" x 'before ", например: https://regex101.com/r/mC4uX3/1

(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

Таким образом вы будете соответствовать только точному числу "x, которое вы хотите".

Ответ 5

Взглянув на расширенный ответ, они утверждают, что их предпоследнее выражение не будет соответствовать последовательностям с одним символом между ними. Существует простой способ исправить это, не используя взгляд вперед/назад и заменить начальный/конечный символ на граничный. Это позволяет сопоставить границы слов, включая начало/конец. Таким образом, соответствующее выражение должно быть:

(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)

Как вы можете видеть здесь: https://regex101.com/r/oC5oJ4/2.

Ответ 6

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

#[a-f0-9]{6}|#[a-f0-9]{3}

Это позволит найти все случаи использования шестнадцатеричных цветовых кодов (длиной 3 или 6 цифр). Но когда я переворачиваю это так

#[a-f0-9]{3}|#[a-f0-9]{6}

он найдет только 3 цифры или первые 3 цифры из 6 цифр. Это имеет смысл, и профессионал Regex может сразу заметить это, но для многих это может быть своеобразным поведением. Существуют некоторые продвинутые функции Regex, которые могут избежать этой ловушки независимо от порядка, но не все по колено в шаблонах Regex.

Ответ 7

Вы также можете записать его жестко, (X{n})|(X{m})