Соответствует нечеткому шаблону без предыдущих слов, но только для одного случая

У меня есть строки типа @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 (?).

Попробуйте @variab(le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*(?!\S), см. regex101.com/r/j3otIZ/1. Если это не соответствует вашим ожиданиям, объясните, что следует сопоставить.

Wiktor Stribiżew 30.12.2018 21:44

@ WiktorStribiżew Спасибо за комментарий, но я хочу, чтобы совпадала только переменная a, а не все, что было до нее. Если вы попробуете мой код, он соответствует a, но также и всему, что идет после него и выглядит как переменная, например a 2 b 3, b тоже выделен. Он также должен работать только тогда, когда раньше был @variable, если вы начинаете удалять символы, он тоже выделяется. Я хочу, чтобы сопоставление начиналось прямо перед a, прекращалось сразу после a и только после (невыделенного) @variable.

a concerned citizen 30.12.2018 22:18

Итак, если ваш механизм регулярных выражений совместим с 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)

Wiktor Stribiżew 30.12.2018 22:53

@ WiktorStribiżew Если я протестирую это на сайте регулярных выражений, он работает, но если я использую его внутри файла *.lang для gEdit, это не так. Как я уже упоминал, я уже пробовал \K, но ничего не вышло. Кроме того, второй метод снова дает мне этот lookbehind assertion is not fixed length. Я не понимаю. GtkSourceView не поддерживает \K или ?<= (которые я должен использовать как ?&lt;= для работы)?

a concerned citizen 30.12.2018 23:21

Я ищу подобные проблемы и нашел это. Последний комментарий от OP гласит: «Он говорит, что это PCRE, но ни опережающий просмотр, ни его эквивалент сущности не работают - фактически они вызывают ошибку gtksourceview». Это датировано 2015 годом. Это выглядит не очень хорошо.

a concerned citizen 30.12.2018 23:26

Вы нашли хорошую ссылку. Используйте @variab(?:le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*\b в родительском контексте и [_a-zA-Z][_a-zA-Z0-9]* в подконтексте.

Wiktor Stribiżew 30.12.2018 23:40

@ WiktorStribiżew Я все еще не могу заставить его работать, но вернусь только в 2019 году. С Новым годом до тех пор.

a concerned citizen 31.12.2018 09:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
90
1

Ответы 1

Изначально я разместил это на вашем проблема с 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>.

Спасибо за ответ, но пока это поведение осталось позади, поэтому в нем больше нет необходимости. Но это еще то, что может понадобиться, я буду искать и копать старые резервные копии и посмотреть, как это работает.

a concerned citizen 30.10.2019 19:00

Другие вопросы по теме