- Сообщения
- 8,673
- Репутация
- 2,486
Пытаюсь обрамить определённую подстроку тегами, но сложность в том, что нужно это сделать для всех подходящих вхождений данной подстроки.
Подстрока это посылаемые клавиши в Send(), поэтому искать её нужно исключительно в рамках кавычек, при чём как одиночных, так и двойных.
Делаю так:
Но как видно, заменяется только первое вхождение.
Внимание вопрос: как произвести тоже самое, но для всех вхождений? :whistle:
P.S
«\Q...\E» это для того чтобы отменить любой потенциально присутствующий служебный символ в искомой подстроке, т.к она берётся из списка поддерживаемых ключей для Send.
Добавлено:
Мда... оказывается есть ещё пару “правил”:
* Эти ключи не должны заменяться если они располагаются во вложенных полукруглых скобках:
тут заменять не нужно.
* После найденного ключа может быть пробел а за ним цифра, и только цифра:
тут заменять нужно.
однако если цифра следует сразу за символом ("не пробел"), то заменять не нужно.
Добавлено:
Ок, последние два правила решил так:
"(('|"")[^\2\{]+?)((?i)[\^+!#]*?{f1[\h\d]*?})([^\2\}]+?\2)"
Добавлено:
Для правила с пробелом после ключа вроде решается так:
* И ещё одно правило - если подстрока уже обрамлена тегами (<tag></tag>), то заменять не нужно.
Подстрока это посылаемые клавиши в Send(), поэтому искать её нужно исключительно в рамках кавычек, при чём как одиночных, так и двойных.
Делаю так:
Код:
$vTest = "Function ('string +{f1} and ^{f1} string')"
;$vTest = 'Function ("string +{f1} and ^{f1} string")'
$sRet = StringRegExpReplace($vTest, "(('|"")[^\2]+?)((?i)[\^+!#]*?\Q{f1}\E)([^\2]+?\2)", '\1<tag>\3</tag>\4')
ConsoleWrite($sRet & @LF)
Но как видно, заменяется только первое вхождение.
Внимание вопрос: как произвести тоже самое, но для всех вхождений? :whistle:
P.S
«\Q...\E» это для того чтобы отменить любой потенциально присутствующий служебный символ в искомой подстроке, т.к она берётся из списка поддерживаемых ключей для Send.
Добавлено:
Сообщение автоматически объединено:
Мда... оказывается есть ещё пару “правил”:
* Эти ключи не должны заменяться если они располагаются во вложенных полукруглых скобках:
Код:
$sVar = '{ {f1} }'
тут заменять не нужно.
* После найденного ключа может быть пробел а за ним цифра, и только цифра:
Код:
$sVar = '{f1 2}'
тут заменять нужно.
однако если цифра следует сразу за символом ("не пробел"), то заменять не нужно.
Добавлено:
Сообщение автоматически объединено:
"(('|"")[^\2\{]+?)((?i)[\^+!#]*?{f1[\h\d]*?})([^\2\}]+?\2)"
Добавлено:
Сообщение автоматически объединено:
Для правила с пробелом после ключа вроде решается так:
Код:
$sRet = StringRegExpReplace($vTest, "(('|"")[^\2]*?)((?i)[\^+!#]*?{f1(?:[\h]+?[\h\d]*?)?})([^\2]*?\2)", '\1<tag>\3</tag>\4')
* И ещё одно правило - если подстрока уже обрамлена тегами (<tag></tag>), то заменять не нужно.