Regex: как мне сопоставить символ перед другими символами захвата? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь найти совпадение в списке строк, в котором я хочу убедиться, что первый символ не является знаком равенства, не фиксируйте это совпадение. Итак, для списка (взятого из стоп-кадра) вроде:

ply==3.10
powerline-status===2.6.dev9999-git.b-e52754d5c5c6a82238b43a5687a5c4c647c9ebc1-
psutil==4.0.0
ptyprocess==0.5.1

Я хочу, чтобы захваченный вывод выглядел так:

==3.10
==4.0.0
==0.5.1

Сначала я подумал, что использование отрицательного взгляда (?![^=]) будет работать, но с регулярным выражением (?![^=])==[0-9]+.* оно в конечном итоге захватывает строку, которую я не хочу:

==3.10
==2.6.dev9999-git.b-e52754d5c5c6a82238b43a5687a5c4c647c9ebc1-
==4.0.0
==0.5.1

Я также пытался использовать группу без захвата (?:[^=]) с регулярным выражением (?:[^=])==[0-9]+.*, но это заканчивалось захватом первого символа, который я тоже не хочу:

y==3.10
l==4.0.0
s==0.5.1

Таким образом, вопрос заключается в следующем: как можно сопоставить, но не захватить строку, перед остальным регулярным выражением?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Отрицательным взглядом будет движение:

(?<!=)==[0-9.]+

Также вот сайт, который мне нравится использовать:

http://www.rubular.com/

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

0 голосов
/ 02 мая 2018

Если вы хотите удалить номера версий из текста, вы можете записать не знак равенства ([^=]) в первой группе захвата с последующим сопоставлением == и номеров версий \d+(?:\.\d+)+. Тогда при замене вы бы использовали свою группу захвата.

Regex

([^=])==\d+(?:\.\d+)+

Замена

Группа 1 $1

Примечание

Вы также можете использовать ==[0-9]+.* или ==[0-9.]+ для сопоставления двойных знаков равенства и номеров версий, но это будет очень широкое совпадение. Первое также будет соответствовать ====1test, а второе также будет соответствовать ==..

0 голосов
/ 02 мая 2018

Есть еще один оператор регулярного выражения, называемый «утверждение просмотра назад» (также называемый положительным взглядом назад) ?<= - и в моем примере выше его использование в выражении (?<=[^=])==[0-9]+.* приводит к ожидаемому результату:

==3.10
==4.0.0
==0.5.1

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

Если есть альтернативы использованию lookbehind для решения, я бы с удовольствием это услышал.

enter image description here

...