Вопрос по regex, c# – Индекс регулярного выражения в соответствующей строке, где не удалось найти совпадение

7

Мне интересно, возможно ли извлечь позицию индекса в данной строке, где Regex не удалось при попытке сопоставить его?

Например, если мое регулярное выражение было "abc" и я попытался сопоставить это с "abd" совпадение будет неудачным в индексе 2.

Изменить для уточнения. Причина, по которой мне это нужно, состоит в том, чтобы позволить мне упростить компонент анализа моего приложения. Приложение представляет собой инструмент обучения языку Assmebly, который позволяет студентам писать, компилировать и выполнять ассемблерные программы.

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

Токенайзер будет генерировать следующие токены при следующем входном значении = & quot; INP: x: & quot;
:

Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL

Эти токены затем анализируются, чтобы убедиться, что они соответствуют синтаксису для данного оператора. В настоящее время это делается с помощью операторов IF и оказывается громоздким. Плюсом этого подхода является то, что я могу предоставить подробные сообщения об ошибках. т.е.

if(token[2] != Token.LABEL) { throw new SyntaxError("Expected label");}

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

Мне было бы интересно узнать, действительно ли это оказалось легче. Никогда не рассматривая код для компилятора, я предполагаю, что код, который генерирует их сообщения об ошибках, часто выглядит так же, как ваш сейчас. harpo
В конце концов я решил продолжить с заявлениями IF. Однако я удалил действительные операторы IF из любых производных классов Statement и вместо этого поместил метод CheckSyntax () в свой базовый класс Statement, который сделал исключение проверки / выбрасывания IF. Это позволило мне убрать много дублирования кода. Richard Walton

Ваш Ответ

5   ответов
0

Чтобы сделать это, вам понадобятся либо обратные вызовы, встроенные в регулярное выражение (которые AFAIK C # не поддерживает), либо, предпочтительно, подключение к механизму регулярных выражений. Даже тогда неясно, какой результат вы бы хотели получить, если бы произошел возврат.

4

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

  1. Get the Regex class source code (e.g. http://www.codeplex.com/NetMassDownloader to download the .Net source).
  2. Change the code to have a readonly property with the failure index.
  3. Make sure your code uses that Regex rather than Microsoft's.
0

Я не верю, что это возможно, но я заинтригован, почему вы хотели бы этого.

Error: User Rate Limit Exceeded Richard Walton
1

Я думаю, что такой индекс будет иметь значение только в каком-то простом случае, как в вашем примере.

Если вы возьмете такое регулярное выражение, как & quot; ab * c * z & quot; (где под * я подразумеваю любой символ) и строку «abbbcbbcdd», каким должен быть индекс, о котором вы говорите? Это будет зависеть от алгоритма, используемого для математики ... Может произойти сбой на & quot; abbbc ... & quot; или на "abbbcbbc ..."

Error: User Rate Limit Exceeded Richard Walton
0

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

Я столкнулся с той же проблемой, подошел к вашему ответу и должен был выработать свое собственное решение. Вот:

https://stackoverflow.com/a/11730035/637142

Надеюсь, поможет

Похожие вопросы