Что нового

[Данные, строки] [Данные, строки] Помогите составить регулярное выражение

DezmontDeXa

Новичок
Сообщения
23
Репутация
0
Есть текст, который может содержать конструкции(возможно несколько) вида: {слово1|слово2|слово3|...}
Как найти такие конструкции и заменить их на случайное значение из перечисленных в них?
Пример:
Вася {гребет|собирает|зарабатывает} {бабло|деньги} лопатой.
Результаты нескольких запусков:
Вася гребет деньги лопатой.
Вася собирает бабло лопатой.
Вася зарабатывает деньги лопатой.
 
Автор
D

DezmontDeXa

Новичок
Сообщения
23
Репутация
0
Код:
$text = GUICtrlRead($Edit1)
   $reg = StringRegExp($text, "{.*}", 3)


ВЫдает массив со всем {|||} конструкциями. Но не дает места совпадения. Т.е. для замены придется еще предварительно искать эти строки в основном тексте, саму строку разделять, рандомно выбирать одну, удалять посреди текста длин найденой строки, вставлять в место совпадения.

Так кто вариант, но может есть способ проще?
 
Автор
D

DezmontDeXa

Новичок
Сообщения
23
Репутация
0
Alofa сказал(а):
Код:
Local $asText, $sTextNew, $sText = 'Вася {гребет|собирает|зарабатывает} {бабло|деньги} лопатой.'

$sText = StringRegExpReplace($sText, '{|}', '')
$asText = StringRegExp($sText, '[^\h]+', 3)
If @error Then Exit
For $i = 0 To UBound($asText) - 1
	$asText[$i] = StringSplit($asText[$i], '|', 2)
Next

While 1
	$sTextNew = ''
	For $i = 0 To UBound($asText) - 1
		$sTextNew &= ($asText[$i])[Random(0, (UBound($asText[$i])-1), 1)] & ' '
	Next
	If $sText = $sTextNew Then
		ContinueLoop
	Else
		$sText = StringTrimRight($sTextNew, 1)
	EndIf
	If MsgBox(4096 + 5, 'Вариант:', $sText) = 2 Then ExitLoop
WEnd
Проще никак? Или заморачиваться не хочешь?)


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

Так и я могу) Неужто нельзя единым регулярным выражением?
Код:
$text = 'Вася {гребет|собирает|зарабатывает} {бабло|деньги} лопатой. И {шикарно|богато|круто} живет'
   $textSplit = StringSplit($text, "{}", 2)
   $sTextOut = ""
   For $i = 0 to UBound($textSplit)-1
	  $textPart = StringSplit($textSplit[$i], "|")
	  if $textPart[0] = 1 Then
		 $sTextOut &=$textPart[1]
		 ContinueLoop
	  Else
		 $textSplit[$i] = $textPart[Random(1, $textPart[0], 1)]
		 $sTextOut &=$textSplit[$i]
	  EndIf
   Next
 
Верх