Что нового

Получение части текста из строки с помощью StringRegExpReplace() функции

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Есть строка следующего вида:

""""ABCD"""" ...

Нужно получить строку ABCD, обрамленную кавычками. Кавычек может быть несколько подряд, но первый символ в исходной строке всегда '"'. Собственно нужно составить шаблон для функции.

Какие предложения?
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
что-то типа эого:
Код:
$string = '""""""""""""ashdkeh"""""""""'
$result = StringRegExpReplace ($string, '"', '')
$final = '"'&$result&'"'
MsgBox (0, "", "original string: "&$string&@CRLF&"new string: "&$final)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR сказал(а):
Вот так я бы сделал:

Код:
$sStr = '""""ABCD""""'
$sPattern = '\A"+|"+\z'
$sResult = StringRegExpReplace($sStr, $sPattern, '')
ConsoleWrite($sResult & @CRLF)

CreatoR, мне наверное нужно было уточнить, что ABCD - это любые символы, кроме '"', а исходная строка не обязательно заканчивается '"'. Например:

"""&*Необходимый () текст~""Мусор_gvlfjg

Нужно получить красный текст.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
А точнее не после кавычки, а вместо второго плюса, ну или после него, если кавычек будет несколько, хотя «.*» указывает на всё что угодно :smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR сказал(а):
А точнее не после кавычки, а вместо второго плюса, ну или после него, если кавычек будет несколько, хотя «.*» указывает на всё что угодно :smile:

Я понял, спасибо. CreatoR, а можно ли в регулярных выражениях ставить условие, например:

Код:
$sText = '"""&*Необходимый () текст~""Мусор_gvlfjg'
;$sText = '   Необходимый_текст         Мусор gvlfjg Еще fgf мусор'

If StringLeft(StringStripWS($sText, 3), 1) = '"' Then
    $sText = StringRegExpReplace($sText, '\A"+|".*\z', '')
Else
    $sText = StringRegExpReplace($sText, '\A\s+|\s.*\z', '')
EndIf

ConsoleWrite($sText & @CR)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Yashied « Ответ #7, Отправлен: Сегодня в 09:57:11 »
можно ли в регулярных выражениях ставить условие, например
Можно, но не так просто как казалось (мне)...
Вот примерно оно, но тут условие упирается на количество пробелов (не менее двух), т.к в строке которую нужно получить (первая переменная) могут содержаться пробелы. Я не знаю как по другому сделать, тут нужно проверять пробеле но чтобы они были после потенциальной кавычки, а не до.

Код:
$sText = '"""&*Необходимый () текст~""Мусор_gvlfjg' 
$sText = ' Необходимый_текст Мусор gvlfjg Еще fgf мусор' 

;If StringLeft(StringStripWS($sText, 3), 1) = '"' Then 
       $sText = StringRegExpReplace($sText, '(\A"+|".*\z)|(\A\s{2,}|\s{2,}.*\z)', '') 
;Else 
;      $sText = StringRegExpReplace($sText, '\A\s+|\s.*\z', '') 
;EndIf 

ConsoleWrite($sText & @CR)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR сказал(а):
Можно, но не так просто как казалось (мне)...
Вот примерно оно, но тут условие упирается на количество пробелов (не менее двух), т.к в строке которую нужно получить (первая переменная) могут содержаться пробелы. Я не знаю как по другому сделать, тут нужно проверять пробеле но чтобы они были после потенциальной кавычки, а не до.

Что то я совсем не втыкаю в эти регулярные выражения. :smile: Всю жизнь пользовался String...() функциями. Можно я тебя еще немножко помучаю? :smile:

Касаемо предыдущего примера. Собственно есть строка вида (в реестре - HKCR\...shell\open\command):

"C:\Program Files\Windows Media Player\wmplayer.exe" "%L"

Я хочу получить путь в первых кавычках, но, как ты понимаешь, этих ковычек может и не быть. Так же ничто не мешает пользователю поставить двойные (или больше) кавычек или пробел(ы) в начале строки (|<--->|""C:\Pro...""). Я предварительно обрабатываю эту строку так:

$sPath = StringStripWS(RegRead(...), 3)

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

"C:\Program Files\Windows Media Player\wmplayer.exe" "%L"

или

C:\PROGRA~1\WINDOW~1\wmplayer.exe "%L"

Вот меня и прибило реализовать это одной лишь функцией StringRegExpReplace(). Получается условие: если первой символ в строке '"', то удаляем все символы '"' в начале и ищем до следующей кавычки; если первый символ не является кавычкой, то просто выбираем строку до первого пробела. Вариант с ""|<--->|"|<->|"" не рассматриваю. Параметр "%L" так же может отсутствовать или быть другим, например %1.

Конечно же я это могу реализовать банально через String...() или с поиощью WinAPI, но StringRegExpReplace() представляется более элегантным решением.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Yashied
У меня как раз почти для таких случаев есть функция _StringStripChars() (весь кредит за RegExp'сы идёт к amel27, я на то время вообще не умел ими пользоваться). Она использует одни лишь RegExp'сы.
Но если нужно именно внутри строки убрать, и при этом не тронуть то что по сторонам, то одним вызовом RegExp будет сложно сделать.

Приведи пример нескольких строк которые могут попадаться в реестре.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Если первый символ в строке - '"', то выполняется

StringRegExpReplace($sText, '\A"+|".*\z', '')

в противном случае, выполняется

StringRegExpReplace($sText, '\A\s+|\s.*\z', '')

Можно ли записать один шаблон для этого?

В реестре храниться полный путь к файлу, который может быть либо обрамлен кавычками, либо нет (предыдущий пост). Если обрамлен кавычками, то кавычек может быть несколько. В начале строки пробелов НЕТ (либо кавычка, либо лубой другой символ, но не пробел!).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Yashied « Ответ #11, Отправлен: Сегодня в 15:31:01 »
Можно ли записать один шаблон для этого?
Вот что то получилось:

Код:
$sText = '"C:\Program Files\Windows Media Player\wmplayer.exe" "%l"'
$sText = '"C:\Program Files\Windows Media Player\wmplayer.exe" %l'
$sText = 'C:\Program Files\Windows Media Player\wmplayer.exe "%l"'
$sText = '"C:\Program Files\Windows Media Player\wmplayer.exe %l"'
$sText = 'C:\Program Files\Windows Media Player\wmplayer.exe %l'
$sText = '    C:\Program Files\Windows Media Player\wmplayer.exe    %l   '

$sText = StringRegExpReplace($sText, '(\A\s+)|(\A"+|".*\z)|(\s"|\s)+%?(."|.)?(\s+|)$', '')

ConsoleWrite($sText & @CR)


Тут даже если нет кавычек то возвращается нужная строка (путь к файлу).
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR сказал(а):
Тут даже если нет кавычек то возвращается нужная строка (путь к файлу).

Ну ты и голова! Работает просто супер! Спасибо! :smile:

+1
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR, я думаю тебе нужно разместить это в разделе "Примеры и рабочие проекты". Оно того стоит.

Я кстати откопал в MSDN очень интересную функцию для получения пути (и не только) из реестра. Как разберусь, обязательно опубликую.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Вот, как и обещал, аналог всего того, что здесь обсуждалось, но с использованием WinAPI.

;D
 
Верх