1 (изменено: humanoid, 2023-02-14 17:24:41)

Тема: AHK: Разделение строки на части без удаления делимитеров

Доброго времени суток.
Имеется строка вида: "Any text-1" "Any text-2" "Any text-3" "Any text-4"и т.д..
Из нее нужно вытащить по шаблону RegExMatch() какие-нибудь части между двойных кавычек с сохранением этих самых кавычек и пробелов, чтобы получить например такое: "Any text-2" "Any text-3".
Пробовал конструкции типа:


str := """Any text-1"" ""Any text-2"" ""Any text-3"" ""Any text-4"""

For each, line in StrSplit(str, chr(34) Chr(32) chr(34))
	out .= line

или

Loop parse, str, "" ""
	{
	out .= A_LoopField
	}

MsgBox % out

Все эти варианты удаляют кавычки и пробелы, но их необходимо сохранить, как в примере выше. Других постоянных делимитеров нет.
Как решить задачу???

2

Re: AHK: Разделение строки на части без удаления делимитеров

В цикле через RegExMatch().

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

3

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker спасибо за подсказку. Уже сам понял и все сделал.

4

Re: AHK: Разделение строки на части без удаления делимитеров

Поделиться не хотите?

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

5 (изменено: humanoid, 2023-02-10 16:25:42)

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker у меня слишком заморочисто получилось. Не знаю, пригодится ли кому ...


Content := """Any dir"" ""AppData\Local"" ""AppData\Roaming"" ""D:\Programs\Notepad++"""

For i, str in StrSplit(Content, chr(34) Chr(32) chr(34))
	If (!RegExMatch(str, "i)^\x22?[a-z]:\\.+")){ ; исключить из поиска строки типа "D:\Programs\Notepad++"
		a := RegExReplace(str, "\x22", "") ; удалить оставшиеся "
		b := StrSplit(a, "\").1 ; разделить полученное по "\" и получить первую часть подстроки
		out .= """" b """ " ; формируем выходной список с двойными кавычками и пробелами
		}
		
For i, str in StrSplit(out , Chr(32)), uniques := {}, D := "" ; удалить дубликаты из полученного списка
	If (!uniques.HasKey(str)){
		D .= str Chr(32), uniques[str] := true
		}
		
out := RTrim(D, Chr(32)) ; удалить из списка все пробелы справа
MsgBox % out

Может есть пути проще, чтобы все ЭТО изваять?

6

Re: AHK: Разделение строки на части без удаления делимитеров

А как вы формулируете задачу? Что изначально есть и что нужно получить. Я из последнего примера не очень понял.

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

7 (изменено: humanoid, 2023-02-10 18:46:05)

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker есть список в одной строке, содержащий path, как в последнем примере. Из него надо исключить все части в кавычках, содержащие "C:\*" "D:\*" и подобные. Затем, если есть, получить корневые директории из оставшихся, содержащие бэкслеш - типа из "AppData\Roaming" получить "AppData", но могут быть и другие. Удалить дубликаты, если будут встречаться два и более раз "AppData" и подобные. И оставшееся вернуть в виде списка корневых директорый (в названии могут быть пробелы) "Dir name 1" "Dir name 2" "AppData" и т.д. ... Сложно все )))
Вообще это директории в 7z архиве, но т.к. нет возможности заглянуть в него без распаковки с помощью AHK, чтобы получить нужные папки для дальнейшей распаковки, использую список с относительными и конкретными путями, который использовался для его упаковки. Если запустить последний пример, будет наглядно видно, что должно получиться...

8

Re: AHK: Разделение строки на части без удаления делимитеров

Content = "Any dir" "AppData\Local" "AppData\Roaming" "D:\Programs\Notepad++"
List := {}, m := ""
while RegExMatch(Content, "O)(?<="")(?![A-Z]:)[A-Z][^""\\]*", m, m ? m.Pos + m.Len : 1)
   List[m[0]] := ""
str := ""
for k in List
   str .= (str = "" ? "" : " ") . """" . k . """"
MsgBox, % str

Так?

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

9 (изменено: humanoid, 2023-02-10 19:09:20)

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker да, только одной строкой и каждая в двойных кавычках: "Any dir" "AppData" и т.д..

10

Re: AHK: Разделение строки на части без удаления делимитеров

Уже подправил.

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

11

Re: AHK: Разделение строки на части без удаления делимитеров

Или такая регулярка, наверно даже правильнее:

RegExMatch(Content, "O)(?<="")[A-Z](?!:\\)[^""\\]*", m, m ? m.Pos + m.Len : 1)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker wow! Кратко, изящно и красиво! Краткость - сестра таланта.))) Большое спасибо!

13

Re: AHK: Разделение строки на части без удаления делимитеров

Обращайтесь!

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

14 (изменено: humanoid, 2023-02-10 19:08:21)

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker Спасибо! Буду разбираться с Вашим кодом. )))

15

Re: AHK: Разделение строки на части без удаления делимитеров

Только точки ставить не забывайте, у нас строгие требования к оформлению.

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

16

Re: AHK: Разделение строки на части без удаления делимитеров

teadrinker вроде все поправил.