Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Регулярное выражение

Ответить
Настройки темы
.NET - Регулярное выражение

В Поисках Истины


Сообщения: 802
Благодарности: 135


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: LilLoco
Дата: 08-08-2013
Добрый день.

Есть Kml файл вида:
PHP код: Выделить весь код

<Placemark>

    <
name>сельское поселение</name>
    <
Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
    <
ExtendedData><SchemaData schemaUrl="#boundary">
        <
SimpleData name="Name">сельское поселение</SimpleData>
        <
SimpleData name="OSM_ID">-1848657</SimpleData>
        <
SimpleData name="ADMIN_LVL">8</SimpleData>
    </
SchemaData></ExtendedData>
      <
MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>35.4913424,56.2869627 35.4866097,56.2876573 35.4835114,56.2879249 35.4866098,56.2876573 35.4913424,56.2869627</coordinates></LinearRing></outerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>35.389971680241118,56.234632701458445 35.3899716,56.2346327 35.3854169,56.2349689 35.389971680241118,56.234632701458445</coordinates></LinearRing></outerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>35.37138496178531,56.235423204282533 35.3713849,56.2354232 35.3704766,56.235525 35.37138496178531,56.235423204282533</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </
Placemark>
ну и так далее... 

Нужно написать регулярное выражение чтобы найти все такие блоки. С регулярными выражениями очень туго Нужно вытащить все данные (Name, OSM_ID, ADMIN_LVL, Coordinates). Но на данный момент я не могу даже вытащить только <Placemark>.

Пробовал так:
Код: Выделить весь код
string textOfFile = System.IO.File.ReadAllText(@"boundary.kml");
Regex r = new Regex(@"<Placemark>\d\D*</Placemark>");
MatchCollection matches = r.Matches(textOfFile);
но ничего не находит.
Попробовал немного иначе:
Код: Выделить весь код
Regex r = new Regex(@"<Placemark>([\s\S]*)</Placemark>");
Находит одно совпадение! Я так понимаю между первым открытием тега и последним закрытием!

Прошу вашей помощи, подскажите как сделать на первом уровне, далее, думаю, сам разберусь.

Спасибо!

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 16:59, 26-06-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Так (код на WSH):
Код: Выделить весь код
Option Explicit

Dim strValue
Dim objMatch


strValue = "aaa0bbb-,-1-,-2-,-ccc-,-3-,-4-,-ddd5-,-6-,-eee-,-7-,-8fff-,-9eee10-,-fff-,-1-,-2-,-3-,-4-,-"

With WScript.CreateObject("VBScript.RegExp")
	.Global = True
	.Pattern = "(?=\d)[\d,-]*\d"
	
	For Each objMatch In .Execute(strValue)
		WScript.Echo objMatch.Value
	Next
End With

WScript.Quit 0
Цитата:
Код: Выделить весь код
0
1-,-2
3-,-4
5-,-6
7-,-8
9
10
1-,-2-,-3-,-4
?

Цитата pva:
можно так:
Код: Выделить весь код
^(\d)|(\d[\d\,\-]*\d)$
»
Нельзя: все совпадения будут односимвольными, т.е. будет всегда отрабатывать первая из альтернатив:
Код: Выделить весь код
^(\d)|(\d[\d\,\-]*\d)$
Добавлено:
pva, проверил ещё раз, поменяв порядок альтернатив. Так:
Код: Выделить весь код
(\d[\d\,\-]*\d)|(\d)
— работает.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:58, 08-08-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать



Цитата LilLoco:
поэтому думал будет проще находить регулярными выражениями »
Цитата:
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.
Ну точно про Вас сказано

Отправлено: 08:26, 09-08-2013 | #12


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата pva:
пиши алгоритмически - потом тебе же легче будет разбираться »
В смысле просто написать свою функцию проверки?)

Цитата Iska:
— работает. »
Не работает - позволяет ввести сначала запятую.
Цитата Iska:
Так (код на WSH): »
Так тоже нет, так же позволяет внести запятую.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 08:31, 09-08-2013 | #13


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата LilLoco:
Не работает - позволяет ввести сначала запятую. »
На WSH — нет:
Код: Выделить весь код
Option Explicit

Dim strValue
Dim objMatch


strValue = ",-1-,-2-,"

With WScript.CreateObject("VBScript.RegExp")
	.Global = True
	.Pattern = "(?=\d)[\d,-]*\d"
	
	For Each objMatch In .Execute(strValue)
		WScript.Echo objMatch.Value
	Next
End With

WScript.Quit 0
Цитата:
Код: Выделить весь код
1-,-2
А что на VB.Net?

Стоп. Что значит «ввести/внести» в Вашей трактовке?

Отправлено: 18:43, 09-08-2013 | #14


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Ну я имею ввиду, что можно в текстовое поле ввести например ,8,9
А необходимо чтобы первый символ - была только цифра.

Вот как то так.

Прошу прощения за изложение мыслей так "непонятно" - сказывается конец рабочей недели((

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 20:16, 09-08-2013 | #15

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Iska:
Нельзя: все совпадения будут односимвольными, т.е. будет всегда отрабатывать первая из альтернатив: »
Действительно косячно работало. Попробовал вот так:
Код: Выделить весь код
var re = /^\d$|^\d[\d\,\-]*\d$/;
var test = [
	"312321",
	"3",
	"31,23-21",
	"31232,1",
	"312321,",
	"-,312321",
	"3-",
	"3-,,,,5",
	"3----6",
	"-3-"
	]

for(i in test) {
	WScript.Echo(test[i] + ":\t\t\t" + re.exec(test[i]));
}
Вроде работает:
Код: Выделить весь код
312321:                 312321
3:                      3
31,23-21:                       31,23-21
31232,1:                        31232,1
312321,:                        null
-,312321:                       null
3-:                     null
3-,,,,5:                        3-,,,,5
3----6:                 3----6
-3-:                    null
Но это всё implementation-specific

Цитата LilLoco:
В смысле просто написать свою функцию проверки?) »
Совершенно верно!

Последний раз редактировалось pva, 09-08-2013 в 22:12.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:07, 09-08-2013 | #16


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата LilLoco:
Ну я имею ввиду, что можно в текстовое поле ввести например ,8,9
А необходимо чтобы первый символ - была только цифра. »
LilLoco, так ввод — это совсем другое. Вам маска ввода нужна для поля ввода, а не регулярка. Регулярка, напротив, поможет из введённого бреда попытаться извлечь что-либо подходящее.

Цитата pva:
Действительно косячно работало. »
Так обратный порядок альтернатив в Вашем примере — работал. Я позже нашёл в документации явное упоминание, что сравнение альтернатив идёт слева направо. Мне же почему-то раньше казалось, что все части равноправны, ан — нет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:50, 10-08-2013 | #17


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Iska:
Регулярка, напротив, поможет из введённого бреда попытаться извлечь что-либо подходящее. »
В .Net есть метод IsMatch, который, как я понял прочитав в первый раз, проверяет соответствие введенной строки с заданным регулярным выражением. Теперь, Iska, вы открыли мне глаза!

Цитата pva:
Совершенно верно! »
Так и сделаю.

Видимо регулярные выражения совершенно не для меня

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 12:45, 11-08-2013 | #18

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png Безымянный.png
(19.7 Kb, 6 просмотров)

LilLoco, Регулярные выражения - очень простая штука. Поиграйся с поиском-заменой в текстовом редакторе (например notepad++) и всё поймёшь. Это очень удобный и для поиска и замены текста инструмент.
Но их функционал ограничивается выявлением шаблона в тексте, не более. Например регулярным выражением нельзя выяснить, что диапазон 999-100 задан неверно.
А кодом, например, можно сделать как на скриншоте (аттач)
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:24, 11-08-2013 | #19


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ребята, не подскажите, как можно сделать заливку этого участка по координатам?
Или залить участок с прозрачностью 50%. ?

это тут делается? <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>

Отправлено: 09:36, 04-05-2016 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Регулярное выражение

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Батничек для настройки "доверенной зоны" IE6 и "добавить... в сетевое окружение". RUVATA Скриптовые языки администрирования Windows 0 21-09-2010 10:16
[решено] Как из текста выбрать все выражения вида "{...}"? evg64 AutoIt 1 26-12-2009 23:38
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") submaster Microsoft Windows NT/2000/2003 5 13-09-2006 12:29
Поиск в яндекс.xml (выделено из "Зацените сайт!") Vampire Вебмастеру 21 11-09-2006 20:31
"Вход в систему недоступен" или "Не найден сервер для проверки пароля входа в сеть" rooty Microsoft Windows NT/2000/2003 8 23-08-2005 02:18




 
Переход