Регулярное выражение ровно n или m раз



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



X{n}|X{m}


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



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

534   5  

5 ответов:

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

альтернатива:

X{m}(X{k})?

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

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

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

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

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

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

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

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

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

вы можете изменить его на (?:[^x]|^)(x{n}|x{m})(?:[^x]|$), переводя на "после без' x ' или после начала строки "и"после без 'x' или после конца строки". Но все же он не будет соответствовать двум последовательностям только с одним символом между ними (потому что первое совпадение потребует символа после, а второе-символа до), как вы можете видеть здесь:https://regex101.com/r/oC5oJ4/1

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

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

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

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

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

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

Comments

    Ничего не найдено.