Имя: Пароль:
1C
 
Поиск подстроки с помощью регулярных выражений.
,
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
ну у меня это будет в общем модуле выполняться, без форм. спасибо ребят, за помощь.