2015-09-01 1 views
4

Примерговорят, что две буквы имеют одинаковый квантор без указания номера в Regex

string1 = aaaaabbbbb 
regex1 = a{5}b{5} 

string2 = aabb 
regex2 = a{2}b{2} 

string2 = aaabbb 
regex2 = a{3}b{3} 

Вы увидите, что 3 примера выше I необходимо указать кванторы из них.

Вместо того чтобы сказать

Мы имеем 5 a следуя за 5 b.

У нас есть 2 a, следующее по 2 b.

У нас есть 3 a, следующего за 3 b.

Я хочу сказать

Мы a подчиняющегося b где a и b имеют один и тот же квантор.

Можно или нет, что я буду использовать только один регулярное выражение, чтобы поймать все эти модели, то Regex может похож на этот

a{n}b{n} 

где n обозначает любое число.

Обратите внимание, что лучший ответ должен также быть в состоянии решить aaaxyzbbb, aaaaxyzbbbb ...

+1

@ terces907 Это не чрезвычайно ясно из вашего вопроса , – ceejayoz

ответ

4

Вы можете достичь этого тоже без рекурсии:

(?:a(?=[^b]*(\1?+b)))+\1 

demo

или с условным тестом:

(?:a(?=[^b]*((?(1)\1b|b))))+\1 

demo

5

Это может быть достигнуто с рекурсии. Например:

a(?R)?b 

Однако точный синтаксис и будет ли она поддерживается в первую очередь зависит от регулярного выражения аромата, который вы используете.

Для получения дополнительной информации см. this article.

+0

Будьте осторожны, regular-expressions.info изменил эти URL-адреса. –

+0

Как насчет в случае aaaxyzbbb, aaaaxyzbbbb, какое решение может решить это? – fronthem

+1

@ terces907 [как это] (https://regex101.com/r/lR5qB2/1): 'a (?: Xyz | (? R)) b', если это то, что вы имеете в виду. –

2

Предполагая, что вы хотите, чтобы равномерно соответствовать одинаковому количеству a & b, вы можете использовать рекурсию с вашим регулярным выражением,

Например: /a(?R)?b/

Над рисунка будет соответствовать:

  • ab
  • aabb
  • aaabbb
  • aaaabbbb

Пожалуйста, обратите внимание, что не все регулярные выражения движки поддерживают рекурсию, но если вы используете PCRE на основе двигателем вы сможете.

Смежные вопросы