У меня есть строки типа @variable a 2 с начала строки. Ключевое слово и его идентификатор @variable известны и фиксированы. Переменные могут иметь [_a-zA-Z] в качестве первого символа, а затем также для номеров второго символа или их комбинаций. Они отделены как минимум пробелом от variable и как минимум пробелом от значения, которое тоже может быть выражением, например (1+2)/2, или какой-либо другой переменной b, поэтому оно начинается с числа, буквы или скобка. После этого в строке может быть много чего неважного (в том числе и новая строка).
Я хочу сопоставить переменную, но только если это первое, что идет после variable, за которым следует значение или выражение. Вот что у меня после последней попытки:
<context id = "variable-noequal" style-ref = "variable">
<match extended = "true">
(((variable|variabel)\b\s+)?)
(([_a-zA-Z][_a-zA-Z0-9]*))
(?=((\s+)|(\s*\n)))
</match>
</context>
Я пробовал различные комбинации (молоток тоже был задействован), но я могу либо не получить совпадения, либо сопоставить каждое совпадение переменной, которая может быть следующей (например, а 2 задобротасакэ). Обратный просмотр всегда дает ошибку lookbehind not fixed или другую подобную. Я также пробовал с prefix/suffix/keyword, где keyword был нечетким совпадением, которое вы видите выше, но это тоже не сработало. Поиск в сети обнаружил \K, который мне ничего не дает. Я знаю, что совпадение могло бы быть лучше, например, как есть, простое подчеркивание может передаваться как переменная, я думаю, что смогу это сделать, но пока я просто хочу, чтобы он был правильно выделен. Наверное, стоит упомянуть, что я не разбираюсь в PCRE. можно ли это исправить?
Извините, я забыл добавить, что это находится в GtkSourceView для gEdit, но, как мне кажется, он основан на PCRE (?).
@ WiktorStribiżew Спасибо за комментарий, но я хочу, чтобы совпадала только переменная a, а не все, что было до нее. Если вы попробуете мой код, он соответствует a, но также и всему, что идет после него и выглядит как переменная, например a 2 b 3, b тоже выделен. Он также должен работать только тогда, когда раньше был @variable, если вы начинаете удалять символы, он тоже выделяется. Я хочу, чтобы сопоставление начиналось прямо перед a, прекращалось сразу после a и только после (невыделенного) @variable.
Итак, если ваш механизм регулярных выражений совместим с PCRE, вы можете использовать @variab(?:le|el)\s+\K[_a-zA-Z][_a-zA-Z0-9]*(?!\S). Если он совместим с .NET, используйте (?<=@variab(?:le|el)\s+)[_a-zA-Z][_a-zA-Z0-9]*(?!\S)
@ WiktorStribiżew Если я протестирую это на сайте регулярных выражений, он работает, но если я использую его внутри файла *.lang для gEdit, это не так. Как я уже упоминал, я уже пробовал \K, но ничего не вышло. Кроме того, второй метод снова дает мне этот lookbehind assertion is not fixed length. Я не понимаю. GtkSourceView не поддерживает \K или ?<= (которые я должен использовать как ?<= для работы)?
Я ищу подобные проблемы и нашел это. Последний комментарий от OP гласит: «Он говорит, что это PCRE, но ни опережающий просмотр, ни его эквивалент сущности не работают - фактически они вызывают ошибку gtksourceview». Это датировано 2015 годом. Это выглядит не очень хорошо.
Вы нашли хорошую ссылку. Используйте @variab(?:le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*\b в родительском контексте и [_a-zA-Z][_a-zA-Z0-9]* в подконтексте.
@ WiktorStribiżew Я все еще не могу заставить его работать, но вернусь только в 2019 году. С Новым годом до тех пор.





Изначально я разместил это на вашем проблема с gtksourceview, но, возможно, кому-то это пригодится:
Я считаю, что что-то вроде этого сделает то, что вы хотите:
<context id = "variable-declaration">
<start>@variable\%]</start>
<end>(?=\S)</end>
<include>
<context id = "variable-name" style-ref = "variable" once-only = "true">
<match>[_a-zA-Z][_a-zA-Z0-9]*</match>
</context>
</include>
</context>
\%] - это настраиваемая граница слова, который похож на \b, но может быть переопределен с помощью <keyword-char-class>.
Спасибо за ответ, но пока это поведение осталось позади, поэтому в нем больше нет необходимости. Но это еще то, что может понадобиться, я буду искать и копать старые резервные копии и посмотреть, как это работает.
Попробуйте
@variab(le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*(?!\S), см. regex101.com/r/j3otIZ/1. Если это не соответствует вашим ожиданиям, объясните, что следует сопоставить.