Что нового

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

Yashied

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

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

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

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

ynbIpb

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

CreatoR

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

Yashied

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

Код:
$sStr = '""""ABCD""""'
$sPattern = '\A"+|"+\z'
$sResult = StringRegExpReplace($sStr, $sPattern, '')
ConsoleWrite($sResult & @CRLF)
CreatoR, мне наверное нужно было уточнить, что ABCD - это любые символы, кроме '"', а исходная строка не обязательно заканчивается '"'. Например:

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

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

CreatoR

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

Yashied

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

CreatoR

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
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 156
Репутация
2 329
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 702
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 156
Репутация
2 329
Yashied
У меня как раз почти для таких случаев есть функция _StringStripChars() (весь кредит за RegExp'сы идёт к amel27, я на то время вообще не умел ими пользоваться). Она использует одни лишь RegExp'сы.
Но если нужно именно внутри строки убрать, и при этом не тронуть то что по сторонам, то одним вызовом RegExp будет сложно сделать.

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

Yashied

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

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

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

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

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
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 702
CreatoR сказал(а):
Тут даже если нет кавычек то возвращается нужная строка (путь к файлу).
Ну ты и голова! Работает просто супер! Спасибо! :smile:

+1
 
Автор
Yashied

Yashied

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

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

Yashied

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

;D
 
Верх