LINUX.ORG.RU

Именованная capture group и [^\g{name}]

 ,


0

1

Почему такой матчинг регулярным выражением работает неверно?

$a=qq("jkj"kjkkj");
say "captures: \n\t".join(', '=>do { my $c=0; map $c++.': ('.$_.')', @l } ) 
 if @l=$a=~m/^\s*(?<Q>['"])([^\g{Q}]+)\g{Q}\s*$/;

Выводит:

captures: 
        0: ("), 1: (jkj"kjkkj)

И это печально: непонятно, почему

[^\g{Q}]
- не работает...

Я пробовал вместо этого

[^(??{ $+{Q} })]
- аналогично, матчит всё подряд.

ЧЯДНТ?

Ответ:

В [] можно использовать только классы символов. Всё остальное будет принято «as is», внутри [] правила интерполяции отличаются от правил для остального регулярного выражения.

Если нужно делать «негативный матчинг» для паттерна известной длины, можно использовать конструкцию:

(?!\g{name}).{LENGTH}

LENGTH нужно подставить числом

Если длина паттерна равна 1 (символ), то просто

(?!\g{name}).

- что имеет смысл «символ, для которого предыдущий символ в предпросмотре не видел \g{name}» :)

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 3)
Ответ на: комментарий от outtaspace

Без дебага понял, что внутри [^] никакие capture-группы не поддерживаются, а «g» здесь - тупо литерал :(

Как же заматчить строки вида

(КАВЫЧКА)-(НЕ_ТА_САМАЯ_КАВЫЧКА)-(ТА_САМАЯ_КАВЫЧКА)

?

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny
([\"'])(?:\\\1|.)*?\1

Понял: суть не в том, что находится внутри окавыченной строки, а в том, что за её пределами. Строго говоря, нам нужно просто заматчить минимальное количество символов от кавычки до кавычки - а дальше регэксп сам зафейлится, пытаясь сопоставить желаемое продолжение текста (например, пустые пробелы или «ничего» до конца строки) с тем куском, где есть кавычка.

То есть суть в том, чтобы строго матчить регэкспом всё, в том числе и то, что «останется за кавычками».

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Нежадный разбор работает как-то совсем странно :(

perl -e '$a=q("hjkhjkh"jkhjk"); print "hello\n" if $a=~m/^\s*".+?"\s*$/'
DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от outtaspace

debug мне ничем не помог. Правильный ответ вписал в свой вопрос :)

DRVTiny ★★★★★
() автор топика

подпслся :)

mos ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.