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