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>

2 ответа

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

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

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

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

(?s)(?<=method )([^' ']+) 

Меня не удивляет, что правила, основанные на внешнем виде, не работают. Подсветка синтаксиса - это просто прославленный лексер, что означает, что он не использует регулярные выражения так, как вы могли бы ожидать. Вместо поиска совпадения он вручную проходит по строке, всегда действуя так, как будто (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) модификатор разрешает точку (.) соответствовать любому символу, включая переводы строки. Это, вероятно, не имеет никакого эффекта, так как подсветчик обрабатывает одну строку за раз, но это определенно не приносит никакой пользы.

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