Что нового

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

Yashied

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

::$DATA
:AS1:$DATA
:AS2:$DATA
:AS3:$DATA

Нужно получить следующее (без кавычек):

"" - пустая строка
":AS1"
":AS2"
":AS3"

Естественно, "AS1", "AS2" и "AS3" могут быть произвольным текстом произвольной длины. Загвоздка в том, что если между символами ":" нет текста, то должна возвращаться пустая строка, в противном случае возвращается сам текст с ":" в начале строки.

Как это сделать с помощью одного вызова StringRegExpReplace()?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
;~ $vTest = '::$DATA'
;~ $vTest = ':AS1:$DATA'
;~ $vTest = ':AS2:$DATA'
$vTest = ':AS3:$DATA'

$sRet = StringRegExpReplace($vTest, '^:(.*?):.*$', '\1')

ConsoleWrite("@error: " & @error & @LF)
ConsoleWrite("Result: " & $sRet & @LF)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А куда делся символ ":"? Нужно так:

::$DATA ==> пусто
:AS1:$DATA ==> :AS1
:AS2:$DATA ==> :AS2
:AS3:$DATA ==> :AS3

Дополнительно, "$DATA" постоянный текст, меняется только то, что находится между символами ":".
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Код:
$vTest = '::$DATA'
;~ $vTest = ':AS1:$DATA'
;~ $vTest = ':AS2:$DATA'
; $vTest = ':AS3:$DATA'

$sRet = StringRegExpReplace($vTest, '^(?:(:[^:]+)|:([^:]*)):.*$', '\1')

ConsoleWrite("@error: " & @error & @LF)
ConsoleWrite("Result: " & $sRet & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
Может так:
Код:
Dim $aText[4] = ['::$DATA', ':AS1:$DATA', ':AS2:$DATA', '::$DATA']

For $i = 0 To 3
	$sRes = StringRegExpReplace($aText[$i], '^(:.+?):.*$', '\1')
	If @extended <> 1 Then $sRes = ''
	ConsoleWrite('Res: >' & $sRes & '<' & @LF)
Next
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Классно, а можно еще учесть наличие ":" в самой строке? Например

:RT:ASR:$DATA ==> :RT:ASR

Вообще, "::$DATA" - постоянная состовляющая. Что-то может появляться только внутри крайних ":".


Добавлено:
Сообщение автоматически объединено:

Я дадумался до этого

Код:
ConsoleWrite(StringRegExpReplace(':AS1:$DATA', '(.*?):\$DATA', '\1') & @CR)


Но здесь остается символ ":" в случае "::$DATA".


Добавлено:
Сообщение автоматически объединено:

Вроде так работает

Код:
StringRegExpReplace(':A:S1:$DATA', '^(:.+?):\$DATA', '\1')


А что означает "?"? Без него тоже работает.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
В этом случае не должно быть ":" в начале?
А что означает "?"?
Как я понимаю, при "?" ищет первое вхождение после скобки, без - последнее.
Код:
ConsoleWrite('Без ?: ' & StringRegExpReplace(':RT:ASR:$DATA:Test', '^(:.+):.*$', '\1') & @LF)
ConsoleWrite('С ?: ' & StringRegExpReplace(':RT:ASR:$DATA:Test', '^(:.+?):.*$', '\1') & @LF)
 
Автор
Yashied

Yashied

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

:smile:

madmasles, а что означает "?"?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
madmasles, а что означает "?"?
обуславливает нежадность квантификаторов. чтобы выбрать попадание наименьшей длины


Добавлено:
Сообщение автоматически объединено:

еще такой вопрос - если :$DATA постоянная строка и всегда в конце, не проще ли его откусывать прежде чем обрабатывать?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Kaster [?]
если :$DATA постоянная строка и всегда в конце, не проще ли его откусывать прежде чем обрабатывать?
Тогда так можно.
Код:
Dim $aText[4] = ['::$DATA', ':AS1:$DATA', ':AS2:$DATA', ':RT:ASR:$DATA']

For $i = 0 To 3
	$sRes = StringReplace($aText[$i], ':$DATA', '')
	If $sRes == ':' Then $sRes = ''
	ConsoleWrite('Res: >' & $sRes & '<' & @LF)
Next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
ConsoleWrite(StringRegExpReplace(':RT:ASR:$DATA', '^::|:?\$DATA$', '') & @CR)
 
Автор
Yashied

Yashied

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

Код:
StringRegExpReplace(':RT:ASR:$DATA', '^(:.+?)(?i):\$DATA', '\1')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied
Я обновил шаблон, теперь учитывает и «:» в подстроке, и получает пустую строку если в начале «::», и возвращает строку с «:» в начале.


Добавлено:
Сообщение автоматически объединено:

Yashied [?]
Вообщем получилось так
А если нет подстроки :smile::$DATA), то так и возвращает, исходную строку :smile:
 
Верх