Что нового

[Данные, строки] Поменять две подстроки местами

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, как поменять подстроки yyy и zzz в строке местами?
Строка:
|xxxxxx|yyy|zzz|xxxxxx|
где x - произвольное количество символов
Последовательность zzz известна посимвольно...
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Код:
$String = "xxxxxxyyyzzzxxxxxx"
$Matches = StringRegExp($String, "(x*)(y+)(z+)(x*)", 1)
If @error = 0 Then
	MsgBox(0, "", $Matches [0] & $Matches [2] & $Matches [1] & $Matches [3])
EndIf
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Извини, что подправил условие задачи... :-[

Вот информация ближе к практике:
Код:
; НАЧАЛО

 $TEXT="|ABC|123|456|789|ABC|123|"
 $SSTR="789"

 ; Зная подстроку "789" надо поменять ее местами с предыдущим элементом,
 ; отделенным символом "|"
 ; подстрока "456" не известна...

; КОНЕЦ
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Не очень элегантно, но примерно так:
Код:
$TEXT="|ABC|123|456|789|ABC|123|"
$SSTR="789"

$Matches = StringRegExp($TEXT, "(.+)\|(.+?)\|(" & $SSTR & ")\|(.+)", 1)
If @error = 0 Then
	MsgBox (0, "", $Matches[0] & "|" & $Matches[2] & "|" & $Matches[1] & "|" & $Matches[3])
EndIf



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

В Perl выглядит попроще :smile:

$TEXT=~ s/(.+)\|(.+?)\|($SSTR)\|(.+)/$1|$3|$2|$4/;
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Спасибо... +1 :smile:
Потестировал с различными вариантами $TEXT и $SSTR - все работает...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Еше вариант без массива :
Код:
$a='|ABC|123|456|789|ABC|123|'
$b='789'
$sPattern='^(.*\|)(.*\|)(' & $b & '\|)(.*)$'
$sRez= StringRegExpReplace($a,$sPattern, '\1\3\2\4')
ConsoleWrite($sRez &@CRLF)
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Подскажи, пожалуйста, как изменить шаблон, если подстроку 789 надо обменять не с предыдущим элементом, а с последующим?

И еще, как учесть в шаблоне случай, когда (при обмене с предыдущим) подстрока 789 крайняя правая плюс символ "|"? И также при обмене с последующим элементом, когда подстрока 789 крайняя левая плюс символ "|"?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR сказал(а):
Подскажи, пожалуйста, как изменить шаблон, если подстроку 789 надо обменять не с предыдущим элементом, а с последующим?
Не претендуя на оптимальность так :

Код:
$a='|ABC|123|456|789|ABC|123|'
$b='789'
$sPattern='^(.*\|)(.*\|)(' & $b & '\|)(.*\|)(.*\|)$'
$sRez= StringRegExpReplace($a,$sPattern, '\1\2\4\3\5')
ConsoleWrite($sRez &@CRLF)




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

snoitaleR сказал(а):
И еще, как учесть в шаблоне случай, когда (при обмене с предыдущим) подстрока 789 крайняя правая плюс символ "|"? И также при обмене с последующим элементом, когда подстрока 789 крайняя левая плюс символ "|"?
Здесь надо подумать как универсализовать Паттерн
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Оказывается, надо 5 групп...
А я с четырьмя что только не пробовал делать... :smile: Никак...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR сказал(а):
И еще, как учесть в шаблоне случай, когда (при обмене с предыдущим) подстрока 789 крайняя правая плюс символ "|"?
Можно так :
Код:
$a='|ABC|123|456|789|ABC|XYZ|'
$b='XYZ'
$sPattern='^(.*\|)(.*\|)('& $b &'\|)(.*)?$'
; $sRez= StringRegExpReplace($a,$sPattern, '\1\3\2')
$sRez= StringRegExpReplace($a,$sPattern, '\1\3\2\4')
ConsoleWrite($sRez &@CRLF)
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Строка $TEXT за пределами этой задачи является перечнем пунктов элемента управления GUICtrlCreateList()...
Я проверяю прямо на списке, но последний вариант не перемещает ни последний пункт списка выше на один, ни любой внутрений...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR [?]
И также при обмене с последующим элементом, когда подстрока 789 крайняя левая плюс символ "|"?
Можно так :
Код:
$a='|XYZ|ABC|123|456|789|ABC|'
$b='XYZ'
$sPattern='^(' & $b & '\|)(.*\|)(.*)$'
$sRez= StringRegExpReplace($a,$sPattern, '\2\1\3')
ConsoleWrite($sRez &@CRLF)


Только надо иметь ввиду ,что это можно и надо оптимизировать
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
А в принципе, есть шанс объединения всех шаблонов в один?
Или нужно будет проверять условия через IF?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR сказал(а):
Строка $TEXT за пределами этой задачи является перечнем пунктов элемента управления GUICtrlCreateList()...Я проверяю прямо на списке, но последний вариант не перемещает ни последний пункт списка выше на один, ни любой внутрений...
Сколько элементов в строке ?
Я думаю нужно оптимизировать Паттерн для любого кол-ва элементов.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Конечно, количество пунктов в списке может быть произвольным...
А пока - 10...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR сказал(а):
gregaz
А в принципе, есть шанс объединения всех шаблонов в один?
Или нужно будет проверять условия через IF?

В один наверняка нет ,т.к. условия то 2 с предыдущим или с последующим.
Конечно есть , попробую. Но я ведь только учусь.
Надо конкретизировать задачу на все случаи
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Буду тогда бэта-тестером... :smile:
А то никакой от меня пользы...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
snoitaleR [?]
Буду тогда бэта-тестером...
Он никогда не даст оптимального результата
Я попробую




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



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

snoitaleR сказал(а):
gregaz
Строка $TEXT за пределами этой задачи является перечнем пунктов элемента управления GUICtrlCreateList()...
Покажи строку.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
gregaz
Хоть немного шуточный вариант, но, в принципе, допустим:

Код:
$TEXT="|Мороз и солнце день чудесный|Еще ты дремлешь друг прелестный|Вставай красавица проснись|Открой сомкнутый негой взоры|На встречу северной Авроры|Звездою севера вернись|"
$SSTR="На встречу северной Авроры"


:smile:
 
Верх