Что нового

StringRegExpReplace и StringRegExp разное поведение по одному шаблону.

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток...
Столкнулся с интересной дилеммой вот в таком участке кода
Код:
#Include <Array.au3>

$input = "#Директория которая будет расшарена для скачивания." _
& @CRLF & "somthing_text RootDirectory StringToReplace \Share"
$sPattern = '(?s)RootDirectory(.+)\\Share'
$sReplace = 'REPLACED'

$outputRegExp = StringRegExp($input, $sPattern, 3)
$outputRegExpReplace = StringRegExpReplace($input, $sPattern, $sReplace)

MsgBox(0, "RegExpReplace result", $outputRegExpReplace)
_ArrayDisplay($outputRegExp)

В случае сo StringRegExp я получаю вполне ожидаемый результат, т.е.
выбирается единственным элементом массива " StringToReplace "
А вот в случае с StringRegExpReplace результат немного неожиданный,
т.к. он почему-то заменяет весь шаблон, т.е. RootDirectory StringToReplace \Share, хотя группой с захватом в шаблоне указано любое количество символов с ленивой квантификацией (.+) лишь между двумя этими строками.
Подскажите где я допускаю ошибку?
Я хотел бы заменять лишь то, что я бы нашел по этому же шаблону...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
$outputRegExpReplace = StringRegExpReplace($input, "StringToReplace", $sReplace)



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

Ещё так можно.
Код:
#Include <Array.au3>

$input = "#Директория которая будет расшарена для скачивания." _
& @CRLF & "somthing_text RootDirectory StringToReplace \Share"
$sPattern = '\w+\s*(?=\\Share)'
$sReplace = 'REPLACED'

$outputRegExp = StringRegExp($input, $sPattern, 3)
$outputRegExpReplace = StringRegExpReplace($input, $sPattern, $sReplace)

MsgBox(0, "RegExpReplace result", $outputRegExpReplace)
_ArrayDisplay($outputRegExp)
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Garrett
, спасибо...
Но мне очень хотелось бы понять почему мой шаблон не подошел? :blink:...
меня не столько интересует конкретный случай, как попрактиковаться в применении регэкспов в AutoIt.



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

Я просто разрабатывал шаблон по общим правилам, ну логика у меня была такая:
необходимо учесть мультистроковость (?s)
строка "RootDirectory" RootDirectory
группа с захватом \ любое количество символов, с ленивой кв. (.+)
строка "\Share", соответственно экранируем бэкслэш \\Share

В итоге получаем (?s)RootDirectory(.+)\\Share
самое главное, что поиск по такому шаблону работате ожидаемо,
а замена нет... Мне интересно почему ?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Единый шаблон составить не выйдет, т.к. для StringRegExpReplace, то что описано в шаблоне выпадает из итога, если его не описать принудительно.
Это можно сделать, загнав нужные на выходе куски шаблона в скобки, а после описать их через "$#"
Код:
$input = "#Директория которая будет расшарена для скачивания." _
& @CRLF & "somthing_text RootDirectory StringToReplace \Share"
$sPattern = '(RootDirectory).+(\\Share)'
$sReplace = 'REPLACED'
$outputRegExpReplace = StringRegExpReplace($input, $sPattern, '$1' & $sReplace & '$2')
MsgBox(0, "RegExpReplace result", $outputRegExpReplace)

$1 = '(RootDirectory)'
$2 = '(\\Share)'
Середину строки мы описали, но не заключили в скобки и ее не будет в "переменных". А "края" строки не попали под описание и они будут на выходе без изменений. Как-то так :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
RUVATA
Я не большой специалист по RegExp`ам, на 60% я их понимаю интуитивно :smile:
Всегда стараюсь зацепиться за ключевые моменты в конкретных задачах, и от них уже отталкиваться. Посему если приходится писать "портянку" из RegExp`ов то мне тяжеловато приходится. :smile:
 
Верх