Что нового

[RegExp] Использование захватывающей группы только в приделах выражения

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос довольно простой - каким образом можно указать выражению использовать захватывающую группу только в пределах этого самого выражения?

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

Пример:
Код:
StringRegExpReplace($vTest, '<(?:\w+)>(.*?)</\1>', '\1')


Тут в выражений «\1» мне нужен для поиска парного тега, однако мне не нужно чтобы оно попадало в строку при замене.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
может так?

Код:
StringRegExpReplace($vTest, '<(\w+)>(.*?)</\1>', '\2')
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
amel27 [?]
Интересно. Получается что замена происходит только для той группы, которая используется?
Тогда почему так не работает:

$vTest = '5 {5} 5 {6} 6'

$sRet = StringRegExpReplace($vTest, '({)(.*)(})', '\2')

ConsoleWrite($sRet & @LF)

Понял, искать нужно всё кроме открывающей скобки:
Код:
$sRet = StringRegExpReplace($vTest, '({)([^{]*)(})', '\2')

и к данной теме оно отношения конечно не имеет :whistle:
 

amel27

Продвинутый
Сообщения
146
Репутация
55
или так:

Код:
StringRegExpReplace($vTest, '({)(.*?)(})', '\2')


хотя исключающий класс лучше
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот наконец наткнулся на тот пример, где это больше всего проявляется:

Код:
$vTest = '"String Line 1"' & @CRLF & "'String Line 2'"

$sRet = StringRegExp($vTest, '(?s).*?(("|'')[^\2]*\2).*?', 3)


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

amel27

Продвинутый
Сообщения
146
Репутация
55
CreatoR сказал(а):
хотелось бы в массив получить строчки которые заключены в кавычки (одиночные и двойные), сами кавычки в массиве мне не нужны.

Так это уже совсем другая задача. AFAIK StringRegExp не поддерживает вывод в массив только определенных сохранений - он всегда выводит ВСЕ сохранения... но ИМХО это всё эстетика, т.к. пропустить служебные сохранения в цикле обхода массива не проблема, установив в цикле For/Next значение Step

З.Ы. у тебя повторяется одна и та же ошибка: паттерн типа "[^\2]" недопустим по двум причинам:

- это класс исключаемых символов, а не исключаемая строка;
- классы не поддерживают сохранений, т.е. являются статическими, а "[^\2]*" равнозначно ".*"
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
amel27 [?]
Так это уже совсем другая задача
Ну почему, как раз таже - нужно исключить из глобальной замены группы, которые используются в самом выражений.


StringRegExp не поддерживает вывод в массив только определенных сохранений - он всегда выводит ВСЕ сохранения
Вот что и требовалось доказать, мне значит нужно то, чего StringRegExp не поддерживает :smile:.

пропустить служебные сохранения в цикле обхода массива не проблема, установив в цикле For/Next значение Step
Я так и сделал, через Step 2 :smile: - но это замедляет процесс замены.

классы не поддерживают сохранений, т.е. являются статическими, а "[^\2]*" равнозначно ".*"
«.*» ищет всё что угодно, а мне нужно чтобы он искал всё, кроме совпадения (первой найденной) кавычки. Хотя может оно действительно ищет тоже самое, т.к на конце я всё равно указываю кавычку.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
я к тому, что если StringRegExp запускать, то массив всё равно придется обходить в цикле, а от значения STEP=1 или 2 скорость обхода не изменится
 
Верх