Что нового

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

Tapok

Новичок
Сообщения
204
Репутация
0
Строка такого типа:
Код:
AAzxdcf125ggbvcoorrrrGGsfsSSS
Надо при нахождении рядом одинаковых символов разбить строку на несколько подстрок. В подстроку входит только один из рядом стоящих одинаковых символов, строчные и заглавные буквы считаются за одинаковые и тоже разделяются.
Для приведенной выше строки будет так:
Код:
A
Azxdcf125g
gbvco
or
r
r
rG
Gsfs
S
S
S
Полученные строки можно поместить в массив.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Мой вариант:
(С учетом регистра). Для его отключения добавьте в начало регулярного выражения (?i)

Код:
#Include <Array.au3>

$sText = 'AAzxdcf125ggbvvcoorrrrGGsfsSSSS' ;A Azxdcf125g gbv vco or r r rG GsfsS S S S
$aRet = _Split($sText)
_ArrayDisplay($aRet)

Func _Split($String)
	Local $iPos, $_Pos = 1, $aDlm, _
		$iLen = StringLen($String)

	If Not $iLen Then Return
	; *
	Local $aRet[$iLen + 1] = [1]
	; ---
	While 1
		$iPos = $_Pos
		; -
		$aDlm = StringRegExp($sText, '(.)\1{1}', 2, $iPos)
		If @Error Then
			$aRet[$aRet[0]] = StringTrimLeft($sText, $_Pos - 1)

			ExitLoop
		EndIf

		$_Pos = @Extended - 1
		$aRet[$aRet[0]] = StringMid($sText, $iPos, $_Pos - $iPos)
		$aRet[0] += 1
	WEnd
	ReDim $aRet[$aRet[0] + 1]
	; ---
	Return $aRet
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Такой вариант
Код:
$Str = "AAzxdcf125ggbvcoorrrrGGsfsSSS"
$Arr = StringSplit($Str, "")
If UBound($Arr) < 2 Then Exit
$Buf = $Arr[1]
For $i = 1 To $Arr[0] - 1
  If $Arr[$i] = $Arr[$i + 1] Then $Buf &= "|"
  $Buf &= $Arr[$i + 1]
Next
$Arr = StringSplit($Buf, "|", 2)

#include <Array.au3>
_ArrayDisplay($Arr)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
InnI, спасибо, все работает! :smile: Код все меньше и меньше ;)
Эта идея мне тоже пришла в голову, только реализовать не смог :smile:
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Мой вариант
Код:
#include <Array.au3> ; for _ArrayDisplay
$Str = "AAzxdcf125ggbvcoorrrrGGsfsSSS"
$Str = StringRegExpReplace($Str, '(?i)([A-zА-яЁё])(?=\1)', '\1' & '|')
$Arr = StringSplit($Str, "|", 2)
_ArrayDisplay($Arr)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
edyapd, в строке могут быть любые символы, например:
Код:
"AAzxdcf125gg++bvcoorrrrG//\\GsfsSSS"
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Можете вставить универсальную строку
Код:
$Str = StringRegExpReplace($Str, '(?i)(.)(?=\1)', '\1' & '|')

Но желательно давать исходные данные сразу, а не по мере решения задачи.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
edyapd, спасибо! Я сам очень люблю регулярки :smile:
 
Верх