Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > разбор строки большее число совпадений


Автор: z911 30.12.2009, 16:57
есть строки вида
Data=(99.237350,88.640575),(99.237422,88.640598),(99.237438,88.640491),(94.237365,88.640468),(99.235298,88.630493) 

представляет собой данные полигона
количество узлов полигона (то что в скобках) произвольно
необходимо отловить только строки где ровно четыре узла


if ((m/(Data=\(.*?\),\(.*?\),\(.*?\),\(.*?\))/))) ...

сравниваю так,  но отлавливаются строки в которых четыре и более узла. Добавление в конец \n не помогает.
кроме того, как изящно сразу сделать приравнивание переменных x1,y1  x2,y2 x3,y3 x4,y4 разбираемых данных (те что в скобках) 

Автор: patap 30.12.2009, 17:36
Код
Data=(\(\d+\.\d+,\d+\.\d+\),?){4}$


или так, по идее должно вернуть x1,y1,x2,y2.....
Код
Data=\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),?$

Автор: Stark 4.1.2010, 00:49
Цитата(patap @ 30.12.2009,  17:36)
Код
Data=(\(\d+\.\d+,\d+\.\d+\),?){4}$


или так, по идее должно вернуть x1,y1,x2,y2.....
Код
Data=\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),\((\d+\.\d+),(\d+\.\d+)\),?$

такой вариант подходит если строка состоит только со строк подобного вида. Мне кажется лучше использовать негативную опережающую проверку
Код

Data=(\(\d+\.\d+,\d+\.\d+\)?){4}(?!,)$

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)