Регулярное выражение ровно n или m раз
рассмотрим следующее регулярное выражение, где X и любой регулярное выражение.
X{n}|X{m}
это регулярное выражение будет проверять для X происходит ровноn или m раза.
есть ли Квантор регулярных выражений, который можно проверить на вхождение X ровно n или m раз?
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