Что нового

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

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
 
Автор
T

Tapok

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

Tapok

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

edyapd

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

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

Tapok

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