Что нового

[RegExp] Поменять местами слова в строке (буквы-цифры-знаки), разделенные пробелом

Бублик2010

Новичок
Сообщения
14
Репутация
0
Прошу помогите, мозг закипает :(
вот строка (разного количества слов):

в ответ: «Когда то. На дне одной, большой

выделил группы
$pattern=\[a-z]*

Но как поменять - в начало строки продублировать (создать строк) так:
большой в ответ: «Когда то. На дне одной, большой
одной в ответ: «Когда то. На дне одной, большой
дне в ответ: «Когда то. На дне одной, большой
На в ответ: «Когда то. На дне одной, большой
Когда то в ответ: «Когда то. На дне одной, большой
ответ в ответ: «Когда то. На дне одной, большой
в в ответ: «Когда то. На дне одной, большой


Подскажите, маюсь ужасно. Подходящих примеров с буквами не нашел, только видел пример строк из цифр. :'(
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
У меня такой вариант:
Код:
#include <Array.au3>
$Str1 = "Какая-то строка, разделенная пробелами. 123 1 2 3"
$Str2 =""
$ArrStr = StringSplit($Str1, " ")
_ArrayReverse($ArrStr, 1)
For $i = 1 To $ArrStr[0]
$Str2 = $Str2&" "&$ArrStr[$i]
Next
MsgBox(64, "Str2", $Str2)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Бублик2010
Можно так попробовать:
Код:
;#include <Array.au3>

$sTextOld = 'в ответ: «Когда то. На дне одной, большой'
$sTextNew = ''
$sText = StringRegExpReplace($sTextOld, '[^\s\wа-яА-Я]', '')
$aTextOld = StringSplit($sText, ' ', 2)
$iLimit = UBound($aTextOld) - 1
Dim $aTextNew[$iLimit + 1]
For $i = 0 To $iLimit
	$sTextNew &= $aTextOld[$iLimit - $i] & ' *** ' & $sTextOld & @CRLF
	;$aTextNew[$i] = $aTextOld[$iLimit - $i] & ' *** ' & $sTextOld
Next
;_ArrayDisplay($aTextNew)
MsgBox(0, '', $sTextNew)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Бублик2010 [?]
Подскажите, маюсь ужасно
Так ?
Код:
#include<Array.au3>
$sString='в ответ: "Когда то. На дне одной, большой'

$aRez=StringRegExp($sString ,'"?(.+?)[,.:]?(?:\s|$)',3)
_ArrayDisplay($aRez)
$sRez=''
For  $i= UBound($aRez)-1 To 0 Step -1
	$sRez&=$aRez[$i]& " " & $sString & @LF
Next
MsgBox(0,'$sRez',$sRez)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
gregaz [?]
Этот шаблон сработает для конкретного случая, если нужно разделить слова, то лучше делать так:

Код:
$sString = 'в ответ: «Когда то. На дне одной, большой'

$sDelims = ' .:,«'
$aWords = StringRegExp($sString, '([А-я\w]+)[\Q' & $sDelims & '\E]?', 3)
$sResult = ''

For  $i = UBound($aWords)-1 To 0 Step -1
    $sResult &= "[" & $aWords[$i] & "] " & $sString & @LF
Next

MsgBox(64, '', $sResult)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR [?]
Этот шаблон сработает для конкретного случая, если нужно разделить слова, то лучше делать так:
Да,ты конечно прав.
Попутный вопрос . Как заставить рег. выражение выполнять поиск справа (с конца) , чтобы не выворачивать массив ??
Не могу вспомнить. По-моему есть такая "фишка". Тогда можно было вообще упростить выражение.



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

Кстати если разговор идет именно о разделении слов ,то наверное , достаточно использовать \b :
Код:
$aWords = StringRegExp($sString, '([А-я\B]+)[\b]?', 3)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
gregaz [?]
Как заставить рег. выражение выполнять поиск справа (с конца) , чтобы не выворачивать массив ?
А какая разница, всё равно нужно соединять слова. В моём выражений поиск делается глобально, а вообще для поиска с конца нужно указать конец строки ($).

Кстати если разговор идет именно о разделении слов ,то наверное , достаточно использовать \b
А что если нужно разделять по заданным символам?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Можно ещё вот так:

Код:
$sString = 'в ответ: «Когда то. На дне одной, большой'

$sDelims = ' .:,«'
$sResult = StringRegExpReplace($sString, '([^\Q' & $sDelims & '\E]+)[\Q' & $sDelims & '\E]*', '[\1] ' & $sString & @CRLF)

MsgBox(64, '', $sResult)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
gregaz [?]
справа налево можно выполнить ?
Код:
$sString = 'Тест1. Тест2.'

$sDelims = '.'
$aResult = StringRegExp($sString, '([^\Q' & $sDelims & '\E]+)[\Q' & $sDelims & '\E]*$', 3)

MsgBox(64, '', $aResult[0])
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Ну это не то.
Он находит одно значение. Его то можно и проще найти .
А разве нет возможности выполнять поиск всех совпадений начиная с конца ???

Точнее : Начать поиск всех совпадений с конца ???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
И ещё:

Код:
$sString = 'в ответ: «Когда то. На дне одной, большой'

$sDelims = ' .:,«'
$aResult = StringRegExp($sString, '([^\Q' & $sDelims & '\E]+)[\Q' & $sDelims & '\E]?', 3)

$sResult = StringFormat( _
    '%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s', _
    $aResult[7], $aResult[6], $aResult[5], $aResult[4], $aResult[3], $aResult[2], $aResult[1], $aResult[0])

MsgBox(64, '', $sResult)
 
Автор
Б

Бублик2010

Новичок
Сообщения
14
Репутация
0
gregaz сказал(а):
CreatoR [?]
Ну скажем для ускорения при обработке длинного текста

А как быть, если в строку вписался символ перехода? Я пытаюсь скомпилировать лингвистический словарь-разговорник. Словарь будет размещаться в словаре типа Dict или Haali. :-[ Уже есть материал, но!

найденная строка имеет вид (содержит один и более символов перехода):
в ответ: «Когда
то. На дне
одной, большой


Как убрать символ переноса? Или как сделать замену порядка слов из строки, которая в натуре выглядит так:
<font>в ответ: «Когда
то. На дне
одной, большой
</font>


Прошу , подскажите: как вытащить полезную строку В ЭТОМ примере из <font></font>. Здесь один и более "переходов" :shok:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
gregaz [?]
Ну скажем для ускорения при обработке длинного текста
О каком ускорений может идти речь, если нам нужно из строки извлеч все слова, какая разница, будут они браться справа или слева, в нашем случае это не релевантно.

Бублик2010 [?]
как быть, если в строку вписался символ перехода?
Код:
$sString = _
	'<font>в ответ: «Когда ' & @CRLF & _
	'то. На дне ' & @CRLF & _
	'одной, большой</font> '

$sDelims = ' .:,«<>/'
$aResult = StringRegExp($sString, '(?:<font>|\r?\n)?([^\Q' & $sDelims & '\E]+)(?:</font>)?[\Q' & $sDelims & '\E]?', 3)

$sResult = StringFormat( _
    '%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s', _
    $aResult[7], $aResult[6], $aResult[5], $aResult[4], $aResult[3], $aResult[2], $aResult[1], $aResult[0])

MsgBox(64, '', $sResult)
 
Верх