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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Есть строка следующего вида:

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

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

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


Думай, прежде чем говорить.

Русское сообщество AutoIt


Оффлайн ynbIpb [?]

  • Скриптер
  • ****
  • Сообщений: 392
  • Репутация: 109
  • Пол: Мужской
    • Награды
что-то типа эого:
Код: AutoIt [Выделить]
$string = '""""""""""""ashdkeh"""""""""'
$result = StringRegExpReplace ($string, '"', '')
$final = '"'&$result&'"'
MsgBox (0, "", "original string: "&$string&@CRLF&"new string: "&$final)
 


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
ynbIpb « Ответ #1, Отправлен: Сегодня в 20:59:23 »
Цитировать
что-то типа эого:
Ну и зачем тогда RegExp?

Вот так я бы сделал:

Код: AutoIt [Выделить]
$sStr = '""""ABCD""""'
$sPattern = '\A"+|"+\z'
$sResult = StringRegExpReplace($sStr, $sPattern, '')
ConsoleWrite($sResult & @CRLF)
 



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вот так я бы сделал:

Код: AutoIt [Выделить]
$sStr = '""""ABCD""""'
$sPattern = '\A"+|"+\z'
$sResult = StringRegExpReplace($sStr, $sPattern, '')
ConsoleWrite($sResult & @CRLF)
 


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

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

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


Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied « Ответ #3, Отправлен: Сегодня в 02:39:31 »
Цитировать
мне наверное нужно было уточнить
Угу.

Цитировать
ABCD - это любые символы, кроме '"', а исходная строка не обязательно заканчивается '"'
Добавь в шаблоне (pattern) после второй кавычки: .*

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Добавь в шаблоне (pattern) после второй кавычки: .*

Да, это работает! Спасибо.

;D

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
А точнее не после кавычки, а вместо второго плюса, ну или после него, если кавычек будет несколько, хотя «.*» указывает на всё что угодно :)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
А точнее не после кавычки, а вместо второго плюса, ну или после него, если кавычек будет несколько, хотя «.*» указывает на всё что угодно :)

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

Код: AutoIt [Выделить]
$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)


Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied « Ответ #7, Отправлен: Сегодня в 09:57:11 »
Цитировать
можно ли в регулярных выражениях ставить условие, например
Можно, но не так просто как казалось (мне)...
Вот примерно оно, но тут условие упирается на количество пробелов (не менее двух), т.к в строке которую нужно получить (первая переменная) могут содержаться пробелы. Я не знаю как по другому сделать, тут нужно проверять пробеле но чтобы они были после потенциальной кавычки, а не до.

Код: AutoIt [Выделить]
$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)

« Последнее редактирование: Сентябрь 07, 2009, 12:15:32 от CreatoR »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Цитата: CreatoR link=topic=57.msg315#msg315
Можно, но не так просто как казалось (мне)...
Вот примерно оно, но тут условие упирается на количество пробелов (не менее двух), т.к в строке которую нужно получить (первая переменная) могут содержаться пробелы. Я не знаю как по другому сделать, тут нужно проверять пробеле но чтобы они были после потенциальной кавычки, а не до.

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

Касаемо предыдущего примера. Собственно есть строка вида (в реестре - 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() представляется более элегантным решением.
« Последнее редактирование: Сентябрь 07, 2009, 15:22:20 от Yashied »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied
У меня как раз почти для таких случаев есть функция _StringStripChars() (весь кредит за RegExp'сы идёт к amel27, я на то время вообще не умел ими пользоваться). Она использует одни лишь RegExp'сы.
Но если нужно именно внутри строки убрать, и при этом не тронуть то что по сторонам, то одним вызовом RegExp будет сложно сделать.

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Если первый символ в строке - '"', то выполняется

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

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

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

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

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied « Ответ #11, Отправлен: Сегодня в 15:31:01 »
Цитировать
Можно ли записать один шаблон для этого?
Вот что то получилось:

Код: AutoIt [Выделить]
$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 [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Тут даже если нет кавычек то возвращается нужная строка (путь к файлу).

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

+1

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR, я думаю тебе нужно разместить это в разделе "Примеры и рабочие проекты". Оно того стоит.

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

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
3726 Просмотров
Последний ответ Октябрь 26, 2010, 13:48:33
от amorph
15 Ответов
6720 Просмотров
Последний ответ Декабрь 29, 2010, 18:57:43
от CreatoR
7 Ответов
5407 Просмотров
Последний ответ Март 06, 2012, 15:10:16
от gregaz
2 Ответов
3196 Просмотров
Последний ответ Май 24, 2012, 16:26:55
от CreatoR
5 Ответов
2861 Просмотров
Последний ответ Март 09, 2013, 18:57:10
от CreatoR
0 Ответов
1265 Просмотров
Последний ответ Март 09, 2013, 18:57:30
от CreatoR
11 Ответов
4868 Просмотров
Последний ответ Май 07, 2013, 16:04:06
от ---Zak---
8 Ответов
2318 Просмотров
Последний ответ Май 31, 2014, 20:32:01
от Z_Lenar
0 Ответов
761 Просмотров
Последний ответ Май 31, 2014, 09:33:55
от madmasles
2 Ответов
1518 Просмотров
Последний ответ Июль 09, 2014, 17:37:22
от InnI