Автор Тема: [RegExp] Использование захватывающей группы только в приделах выражения  (Прочитано 4999 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Вопрос довольно простой - каким образом можно указать выражению использовать захватывающую группу только в пределах этого самого выражения?

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

Пример:
Код: AutoIt [Выделить]
StringRegExpReplace($vTest, '<(?:\w+)>(.*?)</\1>', '\1')


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


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
может так?

Код: AutoIt [Выделить]
StringRegExpReplace($vTest, '<(\w+)>(.*?)</\1>', '\2')


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
amel27  [?]
Цитировать
может так?
Интересно. Получается что замена происходит только для той группы, которая используется?
Тогда почему так не работает:

Цитировать
$vTest = '5 {5} 5 {6} 6'

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

ConsoleWrite($sRet & @LF)

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

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

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
или так:

Код: AutoIt [Выделить]
StringRegExpReplace($vTest, '({)(.*?)(})', '\2')


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

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Вот наконец наткнулся на тот пример, где это больше всего проявляется:

Код: AutoIt [Выделить]
$vTest = '"String Line 1"' & @CRLF & "'String Line 2'"

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


тут хотелось бы в массив получить строчки которые заключены в кавычки (одиночные и двойные), сами кавычки в массиве мне не нужны.
« Последнее редактирование: Апрель 10, 2010, 00:03:30 от CreatoR »

Оффлайн amel27 [?]

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

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

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

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
amel27  [?]
Цитировать
Так это уже совсем другая задача
Ну почему, как раз таже - нужно исключить из глобальной замены группы, которые используются в самом выражений.


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

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

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

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
но это замедляет процесс замены
с чего бы?..  :-\

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
amel27  [?]
Цитировать
с чего бы?
Из за дополнительного цикла.

Оффлайн amel27 [?]

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

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
4978 Просмотров
Последний ответ Август 13, 2010, 19:08:52
от CreatoR
3 Ответов
3817 Просмотров
Последний ответ Ноябрь 08, 2010, 00:43:27
от CreatoR
2 Ответов
2041 Просмотров
Последний ответ Июнь 11, 2012, 12:17:04
от Danlong
3 Ответов
3330 Просмотров
Последний ответ Май 07, 2013, 08:14:36
от dimas1221
6 Ответов
3297 Просмотров
Последний ответ Октябрь 25, 2013, 20:38:36
от C2H5OH
19 Ответов
5344 Просмотров
Последний ответ Февраль 26, 2015, 22:11:44
от AZJIO
1 Ответов
3845 Просмотров
Последний ответ Сентябрь 28, 2015, 16:20:56
от CreatoR
4 Ответов
1003 Просмотров
Последний ответ Ноябрь 21, 2016, 09:42:02
от Alofa
4 Ответов
413 Просмотров
Последний ответ Июнь 13, 2018, 08:11:49
от SavickiyAV
5 Ответов
366 Просмотров
Последний ответ Июнь 20, 2018, 17:53:09
от Alofa