Автор Тема: StringRegExp - не получается правильно сформировать массив  (Прочитано 6223 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171
  • Репутация: 17
  • Пол: Мужской
    • Награды
есть текстовый файл (dict1.txt), содержащий следующие строки:
book|книга
table|стол
chair|стул
retail|розница
tail|хвост
dog|собака
horse|конь,лошадь

необходимо получить массив вида:
book
книга
table
стол
chair
стул
retail
розница
tail
хвост
dog
собака
horse
конь,лошадь
нашел в дебрях интернета следующую конструкцию:
Код: AutoIt [Выделить]
$aRExp = StringRegExp($sText, "(?m)^\s*([^\s]+)\s+([^\s]+)", 3)

но она отрабатывает на пробел, а не на '|'

В регулярных выражениях я "ни бум-бум", прошу помощи...
мы рождены, чтоб сказку сделать былью

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
saavaage
В StringRegExp() я сам "плаваю", но так у меня работает:
Код: AutoIt [Выделить]
#include <Array.au3>

$hFile = FileOpen('test.txt', 0)
$sText = FileRead($hFile)
FileClose($hFile)
$aText = StringSplit(StringStripCR(StringReplace($sText, '|', @LF)), @LF, 2)
_ArrayDisplay($aText)


Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
saavaage  [?]
Цитировать
необходимо получить массив вида:

Код: AutoIt [Выделить]
$aRExp = StringRegExp($sText, '(.*)\|(.*)\r', 3)
 


Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
По-моему предыдущий вариант не захватывает последнюю строчку

А вот мой вариант через через Рег.Выражения :
Код: AutoIt [Выделить]
#include<Array.au3>
$hFile = FileOpen('test.txt', 0)
$sText = FileRead($hFile)
ConsoleWrite($sText& @LF)
$aText=StringRegExp($sText,"(.+?)(?:\||\r\n|$)",3)
_ArrayDisplay($aText)
 

Самая большая проблема – её сформулировать. 

Русское сообщество AutoIt

Re: StringRegExp - не получается правильно сформировать массив
« Ответ #3 Отправлен: Октябрь 31, 2010, 17:43:32 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
r35p3ct
Последняя строка (horse|конь,лошадь) съедается.

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
Не обратил внимание... :whistle:
Код: AutoIt [Выделить]
$aRExp = StringRegExp($sText, '(\w*)\|(\S*)', 3)
 


Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171

  • Автор темы
  • Репутация: 17
  • Пол: Мужской
    • Награды
Спасибо всем. Все предложенные варианты (вкл. последний r35p3ct) отрабатывают на 100%.
Вопрос - какой наиболее оптимальный (скорость обработки), если таких строк будет 10000 - 15000? Не просветите?
PS Сам испытать пока не могу, т.к. племянник еще не набивал слова в словари...

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Вопрос - какой наиболее оптимальный (скорость обработки), если таких строк будет 10000 - 15000? Не просветите?
PS Сам испытать пока не могу, т.к. племянник еще не набивал слова в словари...

Не обзательно набивать .
Для короткого теста мой вариант работает медленнее , чем вариант от     r35p3ct
Ошибся наоборот
« Последнее редактирование: Октябрь 31, 2010, 18:47:36 от gregaz »

Русское сообщество AutoIt

Re: StringRegExp - не получается правильно сформировать массив
« Ответ #7 Отправлен: Октябрь 31, 2010, 18:30:17 »

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171

  • Автор темы
  • Репутация: 17
  • Пол: Мужской
    • Награды
но есть небольшое но:
скрипт r35p3ct отрабатывает некорректно, если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
saavaage  [?]
Цитировать
если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...

Это все легко устраняется добавлением \s? (думаю автор устранит)

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
но есть небольшое но:
скрипт r35p3ct отрабатывает некорректно, если между "Конь, лошадь" есть, например, пробел, то "лошадь" съедается...
Вариант с пробелом учитывается)

Код: AutoIt [Выделить]
$aRExp = StringRegExp($sText, '(\w*)\|(\V*)', 3)


Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171

  • Автор темы
  • Репутация: 17
  • Пол: Мужской
    • Награды
тема решена. Всем спасибо!

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
С оценкой быстродействия я ошибся (не там установил таймер)
все-таки скорость поже выше в моем варианте в 2 раза


Добавлено: Октябрь 31, 2010, 18:55:00
И еще в 2 раза быстрее работает вариант :
Код: AutoIt [Выделить]
$aText=StringSplit($sText,"|" & @cr)

« Последнее редактирование: Октябрь 31, 2010, 18:55:28 от gregaz, Причина: Объединение сообщений »

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171

  • Автор темы
  • Репутация: 17
  • Пол: Мужской
    • Награды
gregaz,  уже пробовал такой вариант, но, к сожалению, он влечет такой некрасивый вывод: см. аттач

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
saavaage
Поставьте флаг 2
Код: AutoIt [Выделить]
$aText=StringSplit($sText,"|" & @cr, 2)


Скорблю и помню.




Русское сообщество AutoIt

Re: StringRegExp - не получается правильно сформировать массив
« Ответ #14 Отправлен: Октябрь 31, 2010, 21:16:01 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
5171 Просмотров
Последний ответ Октябрь 22, 2009, 18:12:33
от Medic84
1 Ответов
2924 Просмотров
Последний ответ Октябрь 21, 2012, 01:46:35
от AZJIO
0 Ответов
1072 Просмотров
Последний ответ Апрель 14, 2014, 20:37:14
от bescom
4 Ответов
2446 Просмотров
Последний ответ Июнь 05, 2014, 10:36:41
от Z_Lenar
0 Ответов
978 Просмотров
Последний ответ Июнь 04, 2014, 21:22:31
от madmasles
12 Ответов
2998 Просмотров
Последний ответ Декабрь 08, 2014, 08:53:28
от Malderin
0 Ответов
615 Просмотров
Последний ответ Декабрь 05, 2014, 15:44:23
от madmasles
40 Ответов
6380 Просмотров
Последний ответ Сентябрь 02, 2015, 23:36:02
от iamOmg
0 Ответов
509 Просмотров
Последний ответ Август 22, 2015, 16:06:03
от madmasles
6 Ответов
2048 Просмотров
Последний ответ Сентябрь 05, 2015, 09:14:50
от boriss