Индекс регулярного выражения в соответствующей строке, где не удалось найти совпадение - PullRequest
7 голосов
/ 20 сентября 2008

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

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

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

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

Токенайзер выдаст следующие токены при следующем вводе = "INP: x:"
:

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 20 сентября 2008

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

  1. Получить исходный код класса Regex (например. http://www.codeplex.com/NetMassDownloader скачать источник .Net).
  2. Измените код, чтобы иметь только для чтения свойство с индексом сбоя.
  3. Убедитесь, что ваш код использует это Regex а не Microsoft.
1 голос
/ 20 сентября 2008

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

Если вы будете принимать регулярное выражение, как «Аб * * г» (где по * я имею в виду любой символ) и строку «abbbcbbcdd», что должно быть индекс, о котором вы говорите? Это будет зависеть от алгоритма, используемого для mathcing ... Может терпеть неудачу на «Абббв ...» или «abbbcbbc ...»

0 голосов
/ 31 июля 2012

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

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

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

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

0 голосов
/ 20 сентября 2008

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

0 голосов
/ 20 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...