1

Тема: AHK: Регулярные выражения

Скрипт:

F1::
    source=zzznameCatBBcccBBsssBB
    res:=RegExReplace(source,".*name(.*)BB.*","$1")
    msgbox % "1) " source "`n2) " res
return

Результат: "CatBBcccBBsss"
Что требуется получить: "Cat"

То есть мне нужно ограничить область в скобочках до первого появления "BB", а то скрипт использует самое последнее появление "BB" как ограничитель.

Есть конечно варианты типа:

res:=RegExReplace(source,".*name(.*)BB.*BB.*BB","$1")

или

res:=RegExReplace(source,".*name(.*)BBccc.*","$1")

Можно ли написать более универсальное выражение и чтобы без перечисления всех возможных символов в квадратных скобках?

2

Re: AHK: Регулярные выражения

    source=zzznameCatBBcccBBsssBB
    msgbox % RegExReplace(source,".*name(.*?)BB.*","$1") 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Регулярные выражения

Спасибо, работает.

Но понять не могу что подобная запись значит.
Прочтение справки по использованию "?" ясности не прибавило

4

Re: AHK: Регулярные выражения

Жадность: (Примеч. переводчика: жадный символ из нескольких возможных отвечающих вариантов выберет самый длинный.) по умолчанию, символы *, ?, +, {min,max} являются жадными, поскольку они поглощают все символы, включая последний из тех, что еще отвечают всему шаблону. Чтобы взамен этого, заставить их остановиться на самом коротком из возможных вариантов соответствия, добавьте следом за любым из них знак вопроса. Например, шаблон <.+> (в котором нет знака вопроса) означает: "найти <, за которым следует одна или большее число литер, за которыми следует >". Такой шаблон захватит всю строку <em>text</em>. Добавьте знак вопроса за плюсом: <.+?>. И поиск остановится на первом символе '>', таким образом этот шаблон отвечает только открывающему тегу <em>.

5

Re: AHK: Регулярные выражения

Хреново я справку читал, там ведь это было

Спасибо, теперь все понятно.

6

Re: AHK: Регулярные выражения

Как правильно заменить все "á", которые находятся в сочетании с кириллицей, не затрагивая остальные?

str =
(
á
raznicá
árznica
ráznica

рáзница
áрзница
ррзницá
)
str := RegExReplace(str, "s)(?=[а-яёА-ЯЁ])á(?=[а-яёА-ЯЁ])", "А")
MsgBox % str

7

Re: AHK: Регулярные выражения

RegExReplace(str, "i)([а-яё])?\Ká(?=(?(1)|[а-яё]))", "А")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: john_dease, 2023-04-24 21:24:01)

Re: AHK: Регулярные выражения

teadrinker, может ли технически считаться тем же самым результатом такое изменение? -

i)([а-яё])?\Ká(?=($|[а-яё]))

Но и в таком виде шаблон не работает, например, в jscript-коде.

9

Re: AHK: Регулярные выражения

Нет, у меня другой принцип.

(?=(?(1)|[а-яё]))

Здесь проверяется наличие в тексте соответствия первому подшаблону (перед буквой), если его нет, то проверяется его наличие после буквы.
Можно даже ещё упростить:

RegExReplace(str, "i)([а-яё])?\Ká(?=(?(1)|(?1)))", "А")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Регулярные выражения

john_dease пишет:

Но и в таком виде шаблон не работает, например, в jscript-коде.

По-моему, там \K не поддерживается. Но ваш шаблон не корректно работает и в AHK:

str = raznicá
MsgBox % RegExReplace(str, "i)([а-яё])?\Ká(?=($|[а-яё]))", "А")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder