Имя: Пароль:
1C
1С v8
RegExp и переносы строк
0 vhl
 
24.10.13
20:33
Есть многострочный файл с текстом вида:
"фффффффф
<SYM>111</SYM>
ыыыыыыыы
<SYM>222
333333</SYM>
вввввв
<SYM>444</SYM>
ааааааа
"
Есть функция:
функция мояфункция()
    МойПаттерн="(<SYM>)(.*)(<\/SYM>)";

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.MultiLine = Истина;
    
    RegExp.Pattern = МойПаттерн;

    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.Прочитать(мойфайл)
    Matches=RegExp.Execute(ТекстФайла);
    
    ЧислоВхождений=Matches.Count();
конецфункции
Какой мне паттерн туда закинуть чтобы получить массив результатов вида
1. 111
2. 222
333333
3. 444

Вышеприведенный шаблон "(<SYM>)(.*)(<\/SYM>)" вполне решает задачи нахождения текста между <SYM> и </SYM> но только если он находится на одной строке, если искомый текст - многострочный, то эта шляпа его не ищет. Причем текст между <SYM> и </SYM> может быть как в 2 строки, так и в 10 - точного количества неизвестно.
Шаблоны вида "(<SYM>)([/s/S]*)(<\/SYM>)" и "(<SYM>)((.|/n|/r)*)(<\/SYM>)" некорректно работают - ищут всё между первым SYM и последним SYM
Есть специалисты по регулярным выражениям?
1 Asmody
 
25.10.13
00:13
Поменяй переводы строк на какую-нибудь белиберду типа {[$#@#$]}
2 b159263
 
25.10.13
02:44
Выполни код: МойПаттерн = СтрЗаменить(МойПаттерн, Символы.ПС, "/n")
3 vhl
 
25.10.13
09:09
(1) (2) Это все костыли. Хотелось бы штатным regexp шаблоном выбрать без доп. преобразований.
4 bambr1975
 
25.10.13
09:16
(<SYM>)((.|\s)*?)(<\/SYM>). Знак вопроса - нужен для того, чтобы паттерн искал ближайшее к нему (<\/SYM>)
5 vhl
 
25.10.13
09:38
(4) Гениально!
Одна проблема, почему-то в результате создются блоки по 4 элемента, т.е.:
Match 1:
1. <SYM>
2. 111
3. 1
4. </SYM>

Match 2:
1. <SYM>
2. 222
333333
3. 3
4. </SYM>

т.е. в 3й элемент кладется последний символ 2го. Я конечно просто пропущу еге, но, чисто ради интереса - почему он возникает и как его избежать?
6 bambr1975
 
25.10.13
10:09
(5) сколько скобочек, столько и элементов. Вообще обычно ищут по SubMatches - в данном случае нужен SubMatches(1). А избежать - никак. Без создания группы квантификаторов (с помощью скобочек) оператор ИЛИ (|) не работает.
7 vhl
 
25.10.13
10:27
(6) Да, я так и делаю, просто скопировал из Rubular'а. В общем спасибо, я верил, что на мисте еще не перевелись спецы :)
AdBlock убивает бесплатный контент. 1Сергей