AvalonEdit выделяет все после слова и до следующего пробела?

Я использую AvalonEdit в приложении, которое работает на моем собственном языке. Я определил файл highlighting.xml, который отлично работает.

Теперь я пытаюсь расширить его в соответствии с:

следующее слово после слова «метод» окрашено в синий цвет.

Я придумал это регулярное выражение, чтобы сделать это:

(?s)(?<=method )(.+?)(?= )

И протестировал его с помощью этого ввода:

via method AMethod on interface

Что прекрасно работает с http://regexstorm.net/tester.

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

<Rule foreground="DarkBlue">
  \(?s)(?<=method )(.+?)(?= )
</Rule>

<Rule foreground="DarkBlue">
  \(?s)(?&lt;=method )(.+?)(?= )
</Rule>

<Rule foreground="DarkBlue">
  (?s)(?<=method )(.+?)(?= )
</Rule>

Этот не нарушал подсветку, но и не работал:

<Rule foreground="DarkBlue">
  (?s)(?&lt;=method )(.+?)(?= )
</Rule>

Возможно ли то, что я пытаюсь сделать? Правильно ли регулярное выражение? Я совершенно не разбираюсь в регулярных выражениях.

Заранее спасибо.

Обновление для ответа Дивисадеро

Эти ломают Подсветку.

<Rule foreground="DarkBlue">
  \(?s)(?<=method )([^' ']+)
</Rule>

<Rule foreground="DarkBlue">
  \(?s)(?&lt;=method )([^' ']+)
</Rule>

<Rule foreground="DarkBlue">
  (?s)(?<=method )([^' ']+)
</Rule>

Эти не ломают Подсветку, но не работают:"

<Rule foreground="DarkBlue">
  (?s)(?&lt;=method )([^' ']+)
</Rule>

person JoanComasFdz    schedule 09.03.2016    source источник
comment
Определены ли via, method, on и interface в вашем языке как ключевые слова? То есть все они входят в правило <Keywords>? Есть ли у вас правило для определяемых пользователем имен в целом с регулярным выражением, таким как \b\w+\b или \b[A-Z]\w*\b?   -  person Alan Moore    schedule 09.03.2016
comment
Только метод и интерфейс — это ключевые слова, окрашенные в зеленый цвет. Также в конце файла есть это правило: ‹Rule foreground=DarkBlue› \b0[xX][0-9a-fA-F]+ # hex number | \b ( \d+(\.[0-9]+)? #число с необязательным числом с плавающей точкой | \.[0-9]+ #или просто начиная с числа с плавающей запятой ) ([eE][+-]?[0 -9]+)? # необязательный показатель степени ‹/Правило›   -  person JoanComasFdz    schedule 09.03.2016


Ответы (2)


Если все, что вам нужно, это выделить имя после метода, используйте:

(?s)(?<=method )([a-zA-Z0-9])+  

Часть '[a-zA-Z0-9]+' должна принимать любые символы, которые вы принимаете в имени.

И если вам действительно как-то нужно все, кроме места, просто используйте:

(?s)(?<=method )([^' ']+) 
person Divisadero    schedule 09.03.2016
comment
Спасибо за ответ, это регулярное выражение выглядит намного проще и по-прежнему работает в regexstorm.net/tester. К сожалению, не в файле highlights.xml. Я обновил вопрос. - person JoanComasFdz; 09.03.2016

Меня не удивляет, что правила, основанные на просмотре назад, не работают. Подсветка синтаксиса — это просто прославленный лексер, что означает, что он не использует регулярные выражения так, как вы могли бы ожидать. Вместо поиска совпадения он проходит по строке вручную, всегда действуя так, как будто (1) текущая позиция является началом строки и (2) регулярное выражение имеет начальную привязку (\A ) на его передней части. Таким образом, ретроспективные проверки не являются незаконными, но они не работают; положительный ретроспективный просмотр, такой как (?<=method ), всегда терпит неудачу, а отрицательный ретроспективный анализ всегда завершается успешно.

Но в любом случае вам не нужно смотреть назад. При лексировании большинства языков вы можете идентифицировать определяемое пользователем имя, потому что оно выглядит как имя и еще не использовалось другим правилом (строка, комментарий, ключевое слово...). В вашем примере via, method, on и interface выглядят как ключевые слова, поэтому их следует включить в правило <Keywords>. Затем вы можете добавить еще одно правило для определяемых пользователем имен, например:

<!-- name -->
<Rule foreground="DarkBlue">
  \b\w+\b
</Rule>

(Это регулярное выражение — всего лишь предположение, но — забавный факт — сокращение \w было изобретено именно для этой цели.) Если вы хотите различать имена методов и другие имена, вы можете добавить другое правило перед этим правилом с символом более конкретное регулярное выражение:

<!-- method name -->
<Rule foreground="LightBlue">
  \b[A-Z]\w*\b
</Rule>

Кстати, модификатор (?s) позволяет точке (.) соответствовать любому символу, включая перевод строки. Возможно, здесь это не имеет никакого значения, так как хайлайтер обрабатывает одну строку за раз, но это определенно не приносит никакой пользы.

person Alan Moore    schedule 09.03.2016
comment
Большое спасибо за всю эту информацию. Я добавил через и далее в качестве ключевых слов без указания цвета. Теперь подсвечивается каждое слово, даже если оно не находится между via и on. - person JoanComasFdz; 09.03.2016
comment
Вы используете разные цвета для ключевых слов и других слов, не так ли? Какие еще есть слова, которые вы не хотите выделять? Есть ли у них разные форматы, например, с заглавной буквы или без нее? - person Alan Moore; 09.03.2016
comment
Ну, я использую структуру GIVEN WHEN THEN, где в какой-то момент должны быть объявлены методы и имена интерфейсов. Но это не очень строго, чтобы люди могли писать предложения. Единственное, что я знаю, это то, что всякий раз, когда этот шаблон записывается [unit][space][%UNITNAME%][через метод][%METHODNAME%][on interface][%INTERFACE NAME%], мне нужно имя метода и интерфейс имя окрашено в разный цвет. И модуль, метод и интерфейс являются ключевыми словами. - person JoanComasFdz; 09.03.2016
comment
Может быть, было бы лучше не выделять их. Если вы закрасите все ключевые слова, другие слова будут выделяться, потому что они не окрашены. - person Alan Moore; 09.03.2016
comment
Да, но я также реализовал, что CONTROL+CLICK ищет такой метод/интерфейс в текущем решении. Вот что я пытаюсь отразить. Поскольку цвет по умолчанию для методов в редакторе черный, я могу оставить его, но мне бы очень хотелось выделить имя интерфейса. - person JoanComasFdz; 09.03.2016