|
Поиск подстроки с помощью регулярных выражений. | ☑ | ||
---|---|---|---|---|
0
morik44
01.10.15
✎
11:31
|
День добрый.
Не могу никак освоить эти рег. выражения, может кто подскажет: Имеется строка шифр "C204-36 код:204-0108" в базе 1с у меня вбит шаблон (префикс): "C* код:" , т.е. всё что идёт после данного префикса мне нужно получить, ну соответственно шаблоны префиксов могут быть разные. Набросал такую процедуру: &НаСервере Процедура Команда1НаСервере() КолСиволов = СтрДлина(Объект.Маска); сч = 1; МаскаРег = ""; Пока сч <= КолСиволов Цикл Символ = Сред(Объект.Маска,сч,1); Если Символ="%" Тогда МаскаРег = МаскаРег+Строка("."); ИначеЕсли Символ="*" Тогда МаскаРег = МаскаРег+Строка("+"); Иначе МаскаРег = МаскаРег+Строка(Символ); КонецЕсли; сч = сч+1; КонецЦикла; МаскаРег = МаскаРег+Строка("+"); Шаблон = МаскаРег; // регулярное выражение соответствует маске префикса СтрокаШифра = Объект.ШифрПозиции; // проверяемый шифр RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске RegExp.Pattern = Шаблон; // шаблон (регулярное выражение) для проверки шифра по маске Если RegExp.Test(СтрокаШифра) Тогда Сообщить("Подходит шифр"); Иначе Сообщить("Не подходит шифр"); КонецЕсли; КонецПроцедуры Но чот не верно делаю - шифр не подходит) Кто шарит в них, может подскажите? |
|||
1
Fragster
гуру
01.10.15
✎
11:32
|
.*
|
|||
2
morik44
01.10.15
✎
11:35
|
(1) Если Символ="%" Тогда
МаскаРег = МаскаРег+Строка("."); тут ? |
|||
3
Fragster
гуру
01.10.15
✎
11:47
|
(2) я хз, что там вообще за код :) в тексте вместо С надо С., причем возможно даже С.*?
|
|||
4
Fragster
гуру
01.10.15
✎
11:47
|
короче там еще пара *
|
|||
5
morik44
01.10.15
✎
11:51
|
Fragster - спасибос, так прокатило)
КолСиволов = СтрДлина(Объект.Маска); сч = 1; МаскаРег = ""; Пока сч <= КолСиволов Цикл Символ = Сред(Объект.Маска,сч,1); Если Символ="%" Тогда МаскаРег = МаскаРег+Строка("."); ИначеЕсли Символ="*" Тогда МаскаРег = МаскаРег+Строка(".*"); Иначе МаскаРег = МаскаРег+Строка(Символ); КонецЕсли; сч = сч+1; КонецЦикла; МаскаРег = МаскаРег+Строка(".*"); |
|||
6
Timon1405
01.10.15
✎
11:53
|
>> всё что идёт после данного префикса мне нужно получить
для этого можно использовать replace Шаблон = "C(?:.+)\sкод:(.+)"; ВходСтрока = "C204-36 код:204-0108"; RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.MultiLine = Ложь; RegExp.Global = Истина; RegExp.IgnoreCase = Истина; RegExp.Pattern = Шаблон; Подходит = RegExp.test(ВходСтрока); Если Подходит Тогда СтрВыход= RegExp.Replace(ВходСтрока,"$1"); Сообщить(СтрВыход); Иначе Сообщить("не подходит"); КонецЕсли |
|||
7
Fragster
гуру
01.10.15
✎
11:54
|
(6) не надо replace, надо скобочки и submatches
|
|||
8
Fragster
гуру
01.10.15
✎
11:58
|
![]() вместо [0-9-]+ можно использовать .+? |
|||
11
Fragster
гуру
01.10.15
✎
11:59
|
||||
12
morik44
01.10.15
✎
12:03
|
мне посути нужно получить часть строки которая идёт после маски.
|
|||
13
Fragster
гуру
01.10.15
✎
12:03
|
(12) тогда первые скобки напиши без скобок :)
|
|||
14
Timon1405
01.10.15
✎
12:04
|
(13) или использовать незапоминающую группировку (?:)
|
|||
15
Fragster
гуру
01.10.15
✎
12:05
|
(14) да, можно.
|
|||
16
Fragster
гуру
01.10.15
✎
12:05
|
![]() |
|||
17
Fragster
гуру
01.10.15
✎
12:09
|
а с чем связано наличие извращений с реквизитом "маска"? почему регэксп не хранить прото так?
|
|||
18
morik44
01.10.15
✎
12:17
|
ну у меня это будет в общем модуле выполняться, без форм. спасибо ребят, за помощь.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |