Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) рег.выражения в vbs (пропустить комментарии) (число прочтений - 8882 )
novichek
Экс-Участник


рег.выражения в vbs (пропустить комментарии)
31. Августа 2007 :: 06:42
Печать  
Задача такая:
Есть текст модуля в котором ищется с помощью рег. выражений в скрипте vbs следующий фрагмент
id = <какое-то число>;
использую паттерн "^[^//][i|I][d|D]\s*=\s*\d+\s*;"


Вопрос: как заставить его пропускать конструкции вида
// п = 0; id = 100; и п = 0; // id = 100;
и не пропускать
п = 0; id = 100;
  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #1 - 31. Августа 2007 :: 07:22
Печать  
может быть не совсем понял что тебе надо, но все же:
^/?([^/]/?)*ВыражениеТолькоНеКомментариях
такое подставляется в моем скрипте Поиск с рег.выражениями, который потом Артур с Лешей полностью перелопатили.
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #2 - 31. Августа 2007 :: 08:20
Печать  
Phoenix, спасибо.
Да, очень похоже на то что нужно, только вот я одного не пойму. При таком паттерне
"^/?([^/]/?)*id\s=\s\d+;"
в результат попадает кусок в котором есть искомая последовательность символов (id = 100;) и все то что стоит до нее начиная со строки следующей за последней строкой комментария.
н.р.:

Код
Выбрать все
Процедура ПриОткрытии()
	СтатусВозврата(0);
	Возврат;
КонецПроцедуры

//
Меню = СоздатьОбъект("СписокЗначений");
Статусы = Перечисление.СтатусыДоверенностей;
Для Сч = 1 По Статусы.КоличествоЗначений() Цикл
	Меню.ДобавитьЗначение(Статусы.ЗначениеПоНомеру(Сч));
КонецЦикла;
k = 12;
id = 100;
 



выдаст:
Код
Выбрать все
Меню = СоздатьОбъект("СписокЗначений");
Статусы = Перечисление.СтатусыДоверенностей;
Для Сч = 1 По Статусы.КоличествоЗначений() Цикл
	Меню.ДобавитьЗначение(Статусы.ЗначениеПоНомеру(Сч));
КонецЦикла;
k = 12;
id = 100;
 



Выходит что символ "^" в начале шаблона игнорируется, или я чего недопонял?
Цитата:
^ - Определяет начало входной строки. Если установлено свойство Multiline, определяет также позицию сразу после "\n" (новая строка) и "\r" (возврат каретки).

(у меня Multiline = True)
  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #3 - 31. Августа 2007 :: 08:39
Печать  
лучше скажи, что ты хочешь получить в результате использования рег.выражения? зачем все это затеяно?
чей-то не оч.хорошо тебя понимаю Печаль
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #4 - 31. Августа 2007 :: 08:48
Печать  
Ну для начала хотелось бы просто получше разобраться с ними, чтобы в дальнейшем представлять где и как их рационально применять и не задавать попусту глупых вопросов  Улыбка
А в этом конкретном случае мне надо из текстового файла получить численное значение переменной "id", если она там определена.
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #5 - 06. Сентября 2007 :: 11:37
Печать  
^[^/\r\n]*id\s*=\s*(\d*)
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #6 - 06. Сентября 2007 :: 11:48
Печать  
alest писал(а) 06. Сентября 2007 :: 11:37:
^[^/\r\n]*id\s*=\s*(\d*)

ИМХО
^[^/\r\n]*id\s*=\s*(\d+)
1. т.е. в конце +
для того, чтобы не поймать неверное выражение без присвоения числа типа "id ="
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #7 - 07. Сентября 2007 :: 09:28
Печать  
alest писал(а) 06. Сентября 2007 :: 11:37:
^[^/\r\n]*id\s*=\s*(\d*)

хм, так вообще ничего не находит  Печаль

alest писал(а) 06. Сентября 2007 :: 11:37:
^[^/\r\n]*id\s*=\s*(\d*)

хм, так вообще ничего не находит  Печаль

текст скрипта (на всякий случай):
Код
Выбрать все
Function GetID()
	GetID = ""
	Set fs = CreateObject("Scripting.FileSystemObject")
	str = "C:\МодульФормы.1s"

	If fs.FileExists(str) Then
		Set File = fs.OpenTextFile(str, 1)

		'str = File.ReadAll
		str = "id = 123;"
		File.Close

		Set re = CreateObject("VBScript.RegExp")
		're.Global = False 'ищем до первого соответствия
		're.Multiline = True 'многострочный текст
		re.Pattern = "^[^/\r\n]*id\s*=\s*(\d+)"
		Set Matches = re.Execute(Str)
		If Matches.Count > 0 Then
			GetId = Matches.Item(0).Value
		End If

	End IF
End Function

GetId() 


... мож где чего "в консерватории" править надо?
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #8 - 07. Сентября 2007 :: 09:47
Печать  
мультилайн включи, скачай программку testrexp и пробуй
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #9 - 07. Сентября 2007 :: 10:03
Печать  
Цитата:
... мож где чего "в консерватории" править надо?

Включи мультилайн, все должно работать.
И пробуй мой вариант с +
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #10 - 07. Сентября 2007 :: 10:05
Печать  
Matches.Count случайно не 2 равно ?
если да, тогда используй для выборки не 0, а 1.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #11 - 07. Сентября 2007 :: 10:08
Печать  
testrexp все находит превосходно
(спасибо  alest, artbear).
мультилайн хоть включен, хоть выключен - по барабану: vb не видит нифига.
а может дело в том что сам синтаксис рег.выражений в VB урезан по сравнению, например с тем же перлом, или я ошибаюсь?

зы: всем спасибо, дело было действительно "в консерватории" Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: рег.выражения в vbs (пропустить комментарии)
Ответ #12 - 07. Сентября 2007 :: 10:16
Печать  
Цитата:
Код
Выбрать все
		Set Matches = re.Execute(Str)
		If Matches.Count > 0 Then
			GetId = Matches.Item(0).Value
		End If 


... мож где чего "в консерватории" править надо?

Конечно, нужно поправить.
Если уж юзаешь вбскрипт, используй его правильно
Код
Выбрать все
	If Matches.Count > 0 Then
		GetId = Matches(0).Submatches(0)
	End If 



Т.е. если в твоем рег-выражении есть скобки, их результат можно получить через Submatches Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #13 - 07. Сентября 2007 :: 10:26
Печать  
artbear писал(а) 07. Сентября 2007 :: 10:16:
Т.е. если в твоем рег-выражении есть скобки, их результат можно получить через Submatches Улыбка


Класс! а я уже нагородил огорода с дополнительным поиском результатах... кароче пАшОл учить матчасть... Улыбка
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: рег.выражения в vbs (пропустить комментарии)
Ответ #14 - 10. Сентября 2007 :: 12:57
Печать  
уж раз пошла такая пьянка, то как мне в случае замены, указать регЭкспу, что надо заменить строку находящуюся в определенном Matches(x).SubMatches(x) именно в том месте, где он ее нашел?

Если я в реплейсе использую паттерн "^[^/\r\n]*id\s*=\s*(\d*)" то заменяется вся строка "id = 123", что в окурат соответствует Matches(0)
« Последняя редакция: 11. Сентября 2007 :: 02:11 - »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать