|
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'а. В общем спасибо, я верил, что на мисте еще не перевелись спецы :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |