Рассмотрим следующее регулярное выражение, где 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})