Могу ли я определить позицию символа, используя Regex с условием префикса?

У меня есть строка, представляющая оператор уравнения: a = b * c в инструменте, который я пишу.

Строка может содержать суффикс «комментарий» к оператору, где * представляет комментарий.

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

Я не уверен, что это можно обнаружить с помощью регулярного выражения, поскольку * char имеет два значения в зависимости от контекста его использования.

E.g.,

  1. a = b * c : * — это символ умножения совпадения, который не сигнализирует о комментарии (без выделения комментариев)
  2. abcdef abcd * a comment : Здесь * — это символ комментария, а строка a comment должна быть выделена как комментарий.
  3. a = b * c * a comment : здесь первый * — это оператор сопоставления, а второй — символ комментария... поэтому строка a comment должна быть выделена как комментарий

Я попробовал следующие определения для обнаружения комментариев в файле XSHD:

<Span color="Comment" begin="\*" end="\n" /> Это явно решает 2-й пример... но он ошибочно установит c в качестве комментария в примере 1.

Затем я попробовал <Span color="Comment" begin="^(?!.*=.*\*).*?\*.*" end="\n" /> , использовал подход с отрицательным прогнозом для решения примера 1, но затем он фиксирует всю строку как комментарий к примеру 2.

Оба определения не могут обнаружить сценарий примера 3.

Мне интересно, не может ли моя проблема быть решена регулярным выражением (как требует XSHD), поскольку * используется в двух разных значениях.

Я использую AvalonEdit 5.0.4.

Есть ли решение?


person NirMH    schedule 19.09.2019    source источник
comment
Что представляет собой правильное утверждение уравнения? Является ли a = b * c * a допустимым уравнением, означающим, что a равно b, умноженному на c, умноженному на a, или является комментарием в этой ситуации.   -  person PaulF    schedule 19.09.2019
comment
@PaulF: в этом случае оператор равен a = b*c * a comment, поэтому последний * является символом комментария, а первый - математическим оператором. два оператора умножения в одной строке не поддерживаются, поэтому a=b*c*a (b умножить на c, умноженное на a) не поддерживается в любом случае   -  person NirMH    schedule 19.09.2019
comment
Я думаю, что это может быть слишком сложно для Regex - требуется разбор первой части строки, чтобы проверить, является ли она допустимым выражением, включающим умножение. Если * разрешено в самом комментарии, это еще больше усложнит ситуацию.   -  person PaulF    schedule 19.09.2019


Ответы (1)


Ну, это действительно зависит от того, насколько гибок ваш синтаксис. Однако с тем, что вы предоставили, попробуйте это:

\*\s?\w( ?[\w]+)+

Не стесняйтесь протестировать его здесь. В этом случае вам не нужно ничего разделять пробелами, но пробелы будут разрешены. Ниже я предоставил две тестовые строки в регулярном выражении 101, посмотрите, подойдет ли это вам.

person Skelp    schedule 06.10.2019