LINUX.ORG.RU

Как найти все группы, начинающиеся с определённого маркера?

 ,


0

1

Что-то туго у меня с регулярными выражениями

Как найти все группы текста, начинающиеся с текста «по причине:»

Ошибка при вызове метода контекста (УстановитьПометкуУдаления)
{Справочник.Файлы.МодульОбъекта(161)}:ВызватьИсключение СтрокаОшибки;
{ОбщийМодуль.РаботаСФайламиВызовСервера.Модуль(3845)}:ФайлОбъект.УстановитьПометкуУдаления(ПометкаУдаления);

по причине:
Ошибка при выполнении
обработчика - 'ПередЗаписью'
по причине:
Ошибка при вызове метода контекста (УстановитьПометкуУдаления)
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Нельзя пометить файл на удаление.
Пометку удаления можно установить, если документ находится в одном из состояний:
 - Проект.

Вот это вроде работает, но не учитывает перенос строк

по причине:\n.*

В смысле «не учитывает перенос строк»?

anonymous
()

Ничего непонятно, но если ты про регулярные выражения в языке 1С, то там есть поддержка многострочного режима.

anonymous
()
Ответ на: комментарий от anonymous

Мне не в 1С нужно, а вот в этом движке: https://rustexp.lpil.uk/

Результат по моему выражению:

Some(Captures({
    0: Some("по причине:\nОшибка при выполнении"),
})),
Some(Captures({
    0: Some("по причине:\nОшибка при вызове метода контекста (УстановитьПометкуУдаления)"),
})),
Some(Captures({
    0: Some("по причине:\nОшибка при выполнении обработчика - 'ПередЗаписью'"),
})),
Some(Captures({
    0: Some("по причине:\nНельзя пометить файл на удаление."),
})),

т.е. обрезает строки, которые после переноса строки идут пробовал (?s) - одна группа только получается

AlexSTAL
() автор топика
Ответ на: комментарий от anonymous

Я пробовал (?s) и (?m), результат хуже:

Some(Captures({
    0: Some("по причине:\nОшибка при выполнении\nобработчика - 'ПередЗаписью'\nпо причине:\nОшибка при вызове метода контекста (УстановитьПометкуУдаления)\nпо причине:\nОшибка при выполнении обработчика - 'ПередЗаписью'\nпо причине:\nНельзя пометить файл на удаление.\nПометку удаления можно установить, если документ находится в одном из состояний:\n - Проект."),
})),
AlexSTAL
() автор топика
Ответ на: комментарий от anonymous

Говорит, конечно, так я и пишу, что пробовал разное:

по причине:\n(?s).*
по причине:\n([.|\n])*

не дружится мне с регуляркой никак

AlexSTAL
() автор топика
Ответ на: комментарий от AlexSTAL

Кек, и это ты ещё не столкнулся с ситуацией, когда «по причине:\n» окажется внутри описания ошибки, а оно там однажды окажется. Может, как-то с другой стороны подходить к проблеме, более осмысленно парсить там?

anonymous
()
Ответ на: комментарий от AlexSTAL

Как насчёт сплитнуть текст по этому «маркеру»? Для надёжности проверять количество получившихся кусочков.

anonymous
()
Ответ на: комментарий от AlexSTAL

а регуляркой прям вообще никак?

  1. Я не знаю, какие там в растовой библиотеке особенности и баги в реализации regex. Кроме того, не сильно часто использую их за пределами того, что в POSIX, так что уровень компетенции в этой области невысокий.

  2. Вообще никогда не использую регулярные выражения для парсинга текста, считаю это говнокодом.

  3. Искренне не понимаю, зачем тебе это в таком тривиальном случае. Текст имеет конкретную структуру, разбить на блоки не проблема.

anonymous
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.