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

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

 X{n}|X{m} 

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

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

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

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

 X{m}(X{k})? 

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

Ниже приведен полный список квантификаторов (см. 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{mn})?/ Для предотвращения проблем с обратным следом .

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

Похоже, вы хотите «xn times» или «xm times», я думаю, что буквальный перевод в regex будет (x{n}|x{m}). Нравится это https://regex101.com/r/vH7yL5/1

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

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

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

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

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

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