Что нового

[RegExp] Игнорирование группы символов в наборе при замене

CreatoR

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

Код:
$vTest = '<span class="au3_S9">$hGUI</span><span class="au3_S8">.</span><span class="au3_S14">GUICreate</span>'
;$vTest = '<span class="au3_S9">$hGUI</span> <span class="au3_S8">=</span> GUICreate'

$sPattern = '([^\w\$(?:<span class="au3_S14">)]+|\A)((?i)GUICreate)(\W+|$)'
$sReplace = '\1<span class="au3_S4">\2</span>\3'

$vTest = StringRegExpReplace($vTest, $sPattern, $sReplace)
ConsoleWrite($vTest & @LF)


То что я имею в виду находится в $sPattern: (?:<span class="au3_S14">) - это и есть тот набор символов который должен помешать замене (предотвратить её).
В данном виде пример отрабатывает коректно - на выходе мы имеем исходную строку, т.е ничего не заменяется. Однако если мы раскомментируем вторую строчку с $vTest, то получим на выходе также исходный результат, хотя в этом случае должна произойти замена, т.к (?:<span class="au3_S14">) не найден в строке.

заметил одну особенность - если в этой группе символов удалить пробелы, то всё работает как надо, но это не выход, мне нужно проверять всю группу как одно целое вхождение.

В чём дело, что я тут не учёл, или может это вообще неверный подход для использования группы в наборе?


Добавлено:
Сообщение автоматически объединено:

Т.е иными словами, вопрос в том, как использовать захватывающие группы ("(группа)") внутри набора ("[набор]")?

Нужно чтобы совпало всё что угодно, кроме указанной группы.


Добавлено:
Сообщение автоматически объединено:

CreatoR [?]
заметил одну особенность - если в этой группе символов удалить пробелы, то всё работает как надо
Ну всё верно, перед GUICreate ведь таки есть пробел :smile: - значит группа игнорируется, все символы в ней (включая сами скобки) определяются как в наборе (каждый символ по отдельности), и это очень плохо...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Я не ас в RegExp, но у меня вот так работает в обоих случаях :smile:
Код:
;~ ~~~
$sPattern = '([^\w\$(?:<span)(.*?)(class="au3_S14">)]+|\A)((?i)GUICreate)(\W+|$)'
;~ ~~~
 
Автор
CreatoR

CreatoR

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

Но я впрочем нашёл решение, я совсем забыл про такую опцию как Lookbehind:

Код:
$sPattern = '([^\w\$]+|\A)(?<!<span class="au3_S14">)((?i)GUICreate)(\W+|$)'



Добавлено:
Сообщение автоматически объединено:

P.S
Но вопрос «как использовать захватывающие группы ("(группа)") внутри набора ("[набор]")» всё ещё в силе, мне просто интересно, оно возможно или нет?
 
Верх