Совпадение с 'x', перед которым стоит четное число 'G' - PullRequest
0 голосов
/ 15 января 2019

Как я могу сопоставить 'x' с четным числом 'G' перед ним?

Например:

x       --> Match the 'x'
Gx      --> Match nothing
GGx     --> Match the 'x'
GGGx    --> Match nothing
GGGGx   --> Match the 'x'
...

Здесь я пытаюсь использовать «Nagative Look Behind»:

(?<!G(GG)*)x

Но квантификатор * внутри вида сзади делает его нефиксированной шириной, поэтому этот шаблон неверен.

Так как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 15 января 2019

Вместо использования (?<!G(GG)*)x, где квантификатор находится во взгляде, вы можете переместить (GG) из взгляда и превратить его в группу без захвата и повторить это 0+ раз (?:GG)*

Вместо этого, если вы утверждаете, что то, что слева, не является G, вы можете утверждать, что это не непробельный символ, используя \S, потому что (?<!G) означает, что "a" допустимо и будет соответствовать х в ax

Наконец, используйте \K, чтобы забыть, что было найдено, и сопоставить x

(?<!\S)(?:GG)*\Kx

Regex demo

0 голосов
/ 15 января 2019

Вы можете использовать это регулярное выражение,

\b(?:[Gg]{2})*\K[xX]\b

Здесь \b гарантирует, что слово не совпадает частично, а (?:[Gg]{2})* обеспечивает совпадение только с четным числом G, предшествующим x, а оператор сброса совпадения \K обеспечивает совпадение только с x, а не с целым. строка.

Демо

0 голосов
/ 15 января 2019

Вы можете попробовать этот шаблон:

(?<!G)(GG)*(?!G)(x)

x будет в группе 2. Демо

0 голосов
/ 15 января 2019

Это то, что вы ищете?

(^|[^G](G{2})+)(x)

Матч 3 должен дать вам х

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...