1 (изменено: hydralisk, 2012-09-29 07:58:57)

Тема: AHK: Помогите разобраться с регулярным выражением.

Добрый день всем!
Для познания азов регэксп написал такой скрипт:

RegExMatch("уа76фывафывацу76фавфв", "(\d+)", s)
msgbox %s1% - %s2% -  %s3%

И не могу понять почему у меня записывается найденное значение только в s1.
В s1 записано 76, а в s2 и s3 ничегошеньки нет.
В справке написано, что все совпадения записываются в массив.

Пробовал такой вариант:

RegExMatch("уа76фывафывацу76фавфв", "(76)", s)
msgbox %s1% - %s2% -  %s3%

И тоже самое. Подскажите что я неправильно делаю.

2 (изменено: Александр_, 2012-09-29 01:31:20)

Re: AHK: Помогите разобраться с регулярным выражением.

hydralisk пишет:

В справке написано, что все совпадения записываются в массив.

Там написано, что все неименованные подшаблоны записываются таким образом. RegExMatch за один вызов выполняет только один поиск, если нужно несколько, то нужно вызывать её в цикле.
Да и название темы исправь, см. правила.

3

Re: AHK: Помогите разобраться с регулярным выражением.

Александр_ пишет:

RegExMatch за один вызов выполняет только один поиск, если нужно несколько, то нужно вызывать её в цикле.

Подскажите как мне организовать цикл, чтобы в тексте регулярными выражениями перебрать все последовательности цифр.
Как доработать этот код (приведенный ниже) чтобы он нашел сначала 76, потом 74, а потом 72?

RegExMatch("ааа76аааббббпппп74ава72вава", "(\d+)", s)
msgbox %s1% - %s2% -  %s3%

4

Re: AHK: Помогите разобраться с регулярным выражением.

У меня родился такой вариант:
1. Запускаем цикл
2. Ищем первое вхождение.
3. Если найдено, то следующая итерация.
4. В следующей итерации ищем вхождение в первичной строке, но начинаем с позиции уже где уже нашли вхождение.
5. Если ничего не найдено - завершаем цикл.

Так будет правильно? Есть другие варианты?

5

Re: AHK: Помогите разобраться с регулярным выражением.

Еще пробовал такой код:

RegExMatch("ааа76аааббббпппп74ава72вава", "(\d+)(\d+)", s)
msgbox %s1% - %s2% -  %s3%

Тогда скрипт вообще ничего не находит.
P.S. Сейчас дошло. может между скобками нужно поставить *
Домой приеду - проверю. Под рукой машины нет.

6 (изменено: Irbis, 2012-09-29 12:49:45)

Re: AHK: Помогите разобраться с регулярным выражением.

RegExMatch("ааа76аааббббпппп74ава72вава", "(\d+)\D+(\d+)\D+(\d+)", s)
msgbox %s1% - %s2% -  %s3%

7

Re: AHK: Помогите разобраться с регулярным выражением.

str := "123qwe234wer456ter567asd768"

varIndex := 1
isPriorLoopFieldIsNumber := false

loop, Parse, str
{
    if A_LoopField is Number
        var%varIndex% .= A_LoopField, isPriorLoopFieldIsNumber := true
    else if (isPriorLoopFieldIsNumber = true)
        varIndex += 1, isPriorLoopFieldIsNumber := false
    else isPriorLoopFieldIsNumber := false
}

loop %varIndex%
    out .= var%A_Index% "`n"

MsgBox % out

8

Re: AHK: Помогите разобраться с регулярным выражением.

hydralisk пишет:

У меня родился такой вариант:
1. Запускаем цикл
2. Ищем первое вхождение.
3. Если найдено, то следующая итерация.
4. В следующей итерации ищем вхождение в первичной строке, но начинаем с позиции уже где уже нашли вхождение.
5. Если ничего не найдено - завершаем цикл.

Так будет правильно? Есть другие варианты?

Правильно:

str := "ааа76аааббббпппп74ава72вава"
r := RegExMatch(str, "\d+", s)
while(r)
{
   MsgBox %s%
   r := RegExMatch(str, "\d+", s, r+StrLen(s))
}

или так:

str := "ааа76аааббббпппп74ава72вава"
r := RegExMatch(str, "P)\d+", s)
while(r)
{
   MsgBox % SubStr(str, r, s)
   r := RegExMatch(str, "P)\d+", s, r+s)
}

9

Re: AHK: Помогите разобраться с регулярным выражением.

Спасибо, доступно объяснили. Я всё понял, что мне надо было. Респект и уважуха этому форуму ;-)

10

Re: AHK: Помогите разобраться с регулярным выражением.

Не могу не добавить (т.е. убавить) к примеру, который предложил Александр_
(Не особо оно там и надо, но... )

str := "ааа76аааббббпппп74ава72вава"
while(r := RegExMatch(str, "\d+", s , r ? r+StrLen(s) : 1))
   MsgBox %s%