Для примера - как найти?
Code: Select all
.*
Code: Select all
[^\n]*
Ваша мысль, как раз, понятна, но это ведь, всё равно, тот же поиск вперед только в определенных, ограниченных пределах, а здесь, как уже сказал Instructor:DV wrote: Поясняю свою мысль картинкой:
К тому же, посчитайте сколько раз отработает парсер при таком поиске? Ведь каждая строка, кроме первой и последней будет парситься дважды (плюс ещё механизм сравнения с точками возврата), в отличие от одного прохода с начала текста и до курсора...Instructor wrote: Сложность не в определении области цикла, а в самом механизме сравнения.
Напоминаю, с чего я всё это начал:YuS wrote:Ваша мысль, как раз, понятна, но это ведь тот же поиск только в определенных, ограниченных пределах
Code: Select all
if (IsVariableMultiLineRegEx(regEx))
{
// ищем от начала файла - как сейчас
}
else
{
// ищем назад (снизу вверх)
}
Code: Select all
1 `(")("|.*[^\\]")` `\0=(0,${STR},0)`
Посчитать символы и разделить на 2?F. Phoenix wrote:Как в coder-файле проверить кол-во символов на четность?
QoutesRE работает построчно, т.е. проверка идет по очереди в каждой строке.F. Phoenix wrote: Составил регулярку для подсветки строк между кавычками с учетом экранирования (нужно именно через QuotesRE):и все бы ничего, да глючит, к примеру, при двух слешах перед закрывающей кавычкой: "блаблабла\".Code: Select all
1 `(")("|.*[^\\]")` `\0=(0,${STR},0)`
Code: Select all
Совпадает если:
присутствует символ двойная кавычка '"', за ним сразу следует либо ещё одна кавычка '"', либо несколько любых символов (квантификатор жадный, т.е. захватывается максимально возможная строка) и любой символ кроме обратного слеш '\', за которым сразу следует двойная кавычка '"'.
Code: Select all
Console.WriteLine("Ошибка при открытии файла \"C:\\MyFile.txt\"");
Ну и вот, для подсветки строки нужно определить, экранирована ли закрывающая кавычка. А экранирована она будет при условии нечетного кол-ва обратных слешей перед ней.Ошибка при открытии файла "C:\MyFile.txt"
Code: Select all
Quotes:
;=======================================================
;Флаги Стиль Цвет Цвет Начало Конец Символ
; шрифта текста фона диапазона диапаз. экран.
;=======================================================
0 0 ${STR} 0 `"` `"` `\`
Code: Select all
"([^\\]|\\.)*?"
А, это уже более понятно, а то ведь подумалось, что баг в AP...F. Phoenix wrote: Ну и вот, для подсветки строки нужно определить, экранирована ли закрывающая кавычка. А экранирована она будет при условии нечетного кол-ва обратных слешей перед ней.
Да, тогда надо подумать над шаблоном.F. Phoenix wrote: Но мне нужен аналог для секции QuotesRE.
Да никакой ошибки в обработке выражения-то нет. Проблема в составлении.
Code: Select all
"([^\\]|\\.)*?"
Code: Select all
"тест" проверка тест\" тест
"тест" проверка тест\" тест тест
"тест" проверка "тест\" тест тест"
abc"тест" проверка "тест" тест "тест"
abc\"тест" проверка "тест\" тест "тест"
abc\\"тест" проверка "тест\\" тест "тест"
abc\\\"тест" проверка "тест\\\" тест "тест"
abc\\\\"тест" проверка "тест\\\\" тест "тест"
abc\\\\\"тест" проверка "тест\\\\\" тест "тест"
Code: Select all
1 `(?<=[^\\])(?:(\\)\1)*\K"([^\\]|\\.)*?"` `\0=(0,${STR},0)`
Не только. Это ещё и ответ на вопрос об определении четности символов, который был задан выше.F. Phoenix wrote:Ну, такой шаблон по поведению ближе к тому, что я написал для секции Quotes, но единственная разница между ними, как я понимаю, это считать ли открывающую кавычку экранированной, если бекслеш стоит перед ней.
Правила правилами, а вероятность ошибок никто не отменял...F. Phoenix wrote:Но в моем случае (синтаксис Gettext) бекслеш перед открывающей кавычкой вообще недопустим.
Code: Select all
"тест" проверка тест\\"тест тест"
Code: Select all
Code:
"тест" проверка тест\\\"тест тест"
Code: Select all
"([^\\]|\\.)*?"
Code: Select all
(?<=[^\\])(?:(\\)\1)*\K"([^\\]|\\.)*?"