Что нового

[Криптография] Разделение строки по пробелам

Talany

Знающий
Сообщения
136
Репутация
11
Доброго времени суток!
Как строку разделить по пробелам к примеру
Код:
$String = "192.168.0.1 Текст Текст2        Текст 3"

На выходе получить массив всех значений.
Заранее благодарю!
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Как то так:
Код:
$String = "192.168.0.1 Текст Текст2        Текст 3"
$sPattern = '(.*?\s+.*?)'
$aResult = StringRegExp($String, $sPattern, 3)
_arraydisplay($aResult)

пока не понял почему последний символ съедает. Может Уважаемые гуру подскажут.
Исправил, теперь не съедает.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Мой вариант
Код:
$String = "192.168.0.1 Текст Текст2        Текст 3"
$String =  StringStripWS($String, 4)
$aArray = StringSplit($String, " ")
For $i=1 To $aArray[0]
   ConsoleWrite("#"&$aArray[$i]&@CRLF)
Next
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
У меня есть недочет :(
Такая строка:
Код:
$String = "    192.168.0.1 Текст Текст2        Текст 3      "

Вернет один лишний пустой элемент
Правка
Код:
$String = "     192.168.0.1 Текст Текст2        Текст 3      "
$String =  StringStripWS($String, 1+2+4)
$aArray = StringSplit($String, " ")
For $i=1 To $aArray[0]
   ConsoleWrite("#"&$aArray[$i]&@CRLF)
Next
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
ildar,
вопрос, конечно, интересный
Давай по порядку.
Собственно суть вопроса которая для меня самого пока что непонятна: у тебя шаблон без групп захвата и в результат попадает только первая часть шаблона.
Если принять это как правило работы с регулярными выражениями (что так и должно быть), то проблема твоего шаблона очевидна - ты ищешь группы любых символов, после которых стоит хотя бы один пробел. "3" под это условие не попадает, так как стоит в конце строки. Поэтому у тебя в результат "3" не выводится.

Ну и мой вариант :smile:
Код:
#Include <Array.au3>
;$String = "192.168.0.1 Текст Текст2        Текст 3"
$String = "    192.168.0.1 Текст Текст2        Текст 3      "
$sPattern = '\S+'
$aResult = StringRegExp($String, $sPattern, 3)
_arraydisplay($aResult)
 
Автор
T

Talany

Знающий
Сообщения
136
Репутация
11
Благодарю всех, с регуляркой не работал вообще.
У меня задача просто получить ВСЕ данные из файла(кто писал руки бы оторвать) в массив и далее в базу.
Пробелы в строке наугад, то есть трока может начинатся с пробела (и не одного...)

Всем спасибо тема надеюсь решена =)
 

ildar

Осваивающий
Сообщения
252
Репутация
30
C2H5OH спасибо.
Видимо не внимательно читал Уроки по работе с Регулярными Выражениями (RegExp), чувствовал должен быть шаблон под это, \S - не увидел. Вот и изобретал велосипед.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Кажется разобрался.
Под шаблон .*? попадают пустые строки.
То есть шаблон .*?\s+.*? означает - от текущего места брать любые символы пока не встретим пробелы и после пробелов что угодно даже пустая строка. Этот шаблон эквивалентен шаблону .*?\s+. И в выводимый результат пробелы попадают тоже.
Вот тестовый скрипт
Код:
#Include <Array.au3>
$String = "    192.168.0.1 Текст Текст2        Текст 3      "
;$String = "192.168.0.1 Текст Текст2        Текст 3"
$sPattern = '.*?\s+.*?'
$aResult = StringRegExp($String, $sPattern, 3)
For $i=0 To UBound($aResult)-1
   ConsoleWrite("#"&$aResult[$i]&"#"&@CRLF)
Next
_arraydisplay($aResult)


Как видино в консоли результатом является текст с пробелами.
Код:
#    #
#192.168.0.1 #
#Текст #
#Текст2        #
#Текст #
#3      #
Так же в результат попадает первый элемент состоящий только из пробелов, то есть пустая строка+пробелы+пустая строка


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

Для меня весьма любопытным фактом оказалось обрезание текста в котором идёт поиск после нахождения заданного шаблона.
Так в скрипте
Код:
#Include <Array.au3>
$String = "    192.168.0.1 Текст Текст2        Текст 3      "
$sPattern = '\S+\s+\S+'
$aResult = StringRegExp($String, $sPattern, 3)
For $i=0 To UBound($aResult)-1
   ConsoleWrite("#"&$aResult[$i]&"#"&@CRLF)
Next
_arraydisplay($aResult)


В результат попадают только
Код:
#192.168.0.1 Текст#
#Текст2        Текст#

Я до сегодняшнего дня думал что должны попасть все-все варианты, в том числе и
#Текст Текст2#
#Текст 3#
 
Верх