1 (изменено: Phoenixxx_Czar, 2022-01-23 02:46:55)

Тема: AHK: Поиск всех вложений regExMatch

Иногда появлялась необходимость найти все вложения в строке по шаблону, натыкался на код, который это делает, но я его вечно терял, а вспоминать суть работы с нуля как-то лень что-ли. Хотел бы поделиться функцией, но интересны недочеты в ней.

regExMatchAll(haystack, needleRegEx, options := "")
{
	out := []

	while RegExMatch(haystack, options "O)" needleRegEx, match, match ? match.Pos + match.Len : 1)
	{
		out.push(match)
	}

	return out
}

Не знаю какой пример применения с ходу можно придумать, но допустим мы хотим получить все английские слова из строки:

str := "I want to grow. I want to be better. You grow. We all grow. We're made to grow. You either evolve or you disappear." ; (C) Tupac Amaru Shakur

for i, match in regExMatchAll(str, "[A-Za-z\'\-]+")
{
	msgbox, % match[0]
}

regExMatchAll(haystack, needleRegEx, options := "")
{
	out := []

	while RegExMatch(haystack, options "O)" needleRegEx, match, match ? match.Pos + match.Len : 1)
	{
		out.push(match)
	}

	return out
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2

Re: AHK: Поиск всех вложений regExMatch

Phoenixxx_Czar пишет:

недочеты в ней

Может понадобиться изменить опции в RegEx, здесь такой возможности нет. Я бы сразу использовал while RegExMatch ... без всякой функции.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Поиск всех вложений regExMatch

Не совсем понял сути функции. Если задача разделить по словам, можно обойтись более простым способом:

For i in Match := StrSplit(str, " ", ".")
 MsgBox, % Match[i]
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Поиск всех вложений regExMatch

Боже.. Это обычный пример, где обычный regExMatch не захватит все группы. Конечно можно сделать и как у вас, но нужно учесть, что есть еще запятые, да ведь? И в чем прикол использование for в таком виде?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

5 (изменено: svoboden, 2022-01-22 13:20:38)

Re: AHK: Поиск всех вложений regExMatch

Я вижу недочет, что не сохраняются русские символы. Насколько знаю, в regExMatchAll за это отвечает: *UCP. А так, ничего особенного.

6 (изменено: Phoenixxx_Czar, 2022-01-22 14:14:47)

Re: AHK: Поиск всех вложений regExMatch

В данном примере использовалась регулярка на вхождение английских символов, одинарная кавычка и тире.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

7 (изменено: svoboden, 2022-01-22 16:13:50)

Re: AHK: Поиск всех вложений regExMatch

А про какие недочеты тогда говориться, если скрипт работает.

8 (изменено: __Михаил__, 2022-01-22 18:20:08)

Re: AHK: Поиск всех вложений regExMatch

Phoenixxx_Czar

Использовать цикл 'For' куда удобнее и красивее, меньше строк выходит и никаких функций не нужно придумывать.
Про какие группы идёт речь? Запятую тоже можно игнорить если что. RegEx работает дольше обычных команд, так что думаю его лучше использовать в сложных задачах.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

9

Re: AHK: Поиск всех вложений regExMatch

Phoenixxx_Czar, советую вставить "s" в опции.

10 (изменено: Phoenixxx_Czar, 2022-01-23 02:46:38)

Re: AHK: Поиск всех вложений regExMatch

__Михаил__ пишет:

Использовать цикл 'For' куда удобнее и красивее, меньше строк выходит и никаких функций не нужно придумывать.

For i, val in Match := StrSplit(str, " ", ".")
    MsgBox, % val

Куда удобнее будет, чем 'Match[ i]'.

Malcev, думаю все же добавить возможность добавлять свои параметры - проще.

regExMatchAll(haystack, needleRegEx, options := "")
{
	out := []

	while RegExMatch(haystack, options "O)" needleRegEx, match, match ? match.Pos + match.Len : 1)
	{
		out.push(match)
	}

	return out
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

11

Re: AHK: Поиск всех вложений regExMatch

Phoenixxx_Czar пишет:

думаю все же добавить возможность добавлять свои параметры - проще.

Думаю, еще проще вообще не использовать функцию, состоящую из одной лишь функции.