|
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'а. В общем спасибо, я верил, что на мисте еще не перевелись спецы :)
|
|