Показать полную графическую версию : Получение массива из строки с числами
Есть строка следующего вида: "5-23,45,54,60-62" нужно создать массив из чисел от 5 до 23, 45, 54 и от 60 до 62. Т.е. аналог печати из Word, когда задаются диапазоны печати страниц. Признаюсь что я не силен в рег. выражениях, но чувствую что где то в них собака зарыта если кто быстро соображает помогите, пытаюсь сам одновременно разобраться. Нужно конечно еще и ошибки обрабатывать, должны быть только цифры, знаки "-" и "," а также при указании диапазона первая цифра меньше второй. (5-23 а не 23-5)
Я бы воспользовался таким алгоритмом:
1. Проверить строку на лишние символы и вырезать их.
2. Разбить строку по запятым StringSplit($str, ",")
3. Полученный массив обходим в цикле поэлементно и каждый элемент обрабатываем следующим образом:
3.1. Проверяем наличие дефиса в элементе.
3.2. Если дефиса нет, то просто копируем элемент в хранилище, скажем, $arr2.
3.3. Если дефис есть, то (предполагается, что пользователь не будет писать 5-20-40. Хотя можно потом и до такого расширять алгоритм):
3.4. Разбить строку по разделителю "дефис".
3.5. Проверить, чтобы 1 элемент был меньше второго.
3.6. В цикле от "1 элем" до "2 элем" создать последовательность чисел и записать в $arr2.
хмм тоже вариант, и кажется более мне понятный, попробую набросать и выложить, только с первым пунктом не согласен, пускай пишут правильно, возможно пользователь перепутал "," с "." и если я удалю точку то получится к примеру из "3.5" не 3 и 5, а 35, что неверно
Вот так по алгоритму :):
#include <Array.au3>
$sVar = "5-23,45,54,60-62"
$aRange_Array = _GetRangeNumbersArray($sVar)
_ArrayDisplay($aRange_Array)
Func _GetRangeNumbersArray($sString, $sStr_Delim=",", $sRange_Delim="-")
Local $aStr_Split = StringSplit($sString, $sStr_Delim)
Local $aRetArr[1], $aRange_Split, $iFor, $iTo
For $i = 1 To $aStr_Split[0]
If StringInStr($aStr_Split[$i], $sRange_Delim) Then
$aRange_Split = StringSplit($aStr_Split[$i], $sRange_Delim)
$iFor = Number($aRange_Split[1])
$iTo = Number($aRange_Split[$aRange_Split[0]])
For $j = $iFor To $iTo ;От первого к последнему
$aRetArr[0] += 1
ReDim $aRetArr[$aRetArr[0]+1]
$aRetArr[$aRetArr[0]] = $j
Next
Else
$aRetArr[0] += 1
ReDim $aRetArr[$aRetArr[0]+1]
$aRetArr[$aRetArr[0]] = $aStr_Split[$i]
EndIf
Next
Return $aRetArr
EndFunc
P.S
Не знаю почему, но у меня есть слабость к таким задачкам http://files.myopera.com/Creat0R/Opera_AC/Icons/whistle.gif
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.