Можно ли отменить поиск по регулярному выражению? - PullRequest
0 голосов
/ 09 ноября 2009

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

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что я хочу, чтобы у пользователя было все содержимое этого токенизированного файла. I.E части, которые они ищут, и части, которые они не видят (частичное выделение будет хорошим примером этого).

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

Таким образом, если бы пользователь хотел лексировать строку для каждого вхождения "T", версия с отрицанием найдет все, кроме "T".

Теперь вышесказанное легко сделать, но что если пользователь предоставит 8 различных выражений сложной природы, есть ли способ объединить все эти выражения в одно и свести на нет партию?

1 Ответ

1 голос
/ 09 ноября 2009

Вы можете объединить несколько RegEx в 1, используя (pattern1) | (pattern1) | ... Чтобы отрицать это, вы просто проверьте на! IsMatch

var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})"); 

вернул бы фактически 2 токена (обратите внимание, что я использовал одно и то же имя дважды ... это нормально) Также изучите Regex.Split. Например:

var split = Regex.Split("aa bb cc dd", @"(?<token>aa bb)|(?:\s+)");

возвращает слова как токены, за исключением слова "aa bb", которое возвращается как один токен, потому что я определил его так же с (? ...).

Вы также можете использовать свойства Index и Length для вычисления средних частей, которые не были распознаны регулярным выражением:

var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
for (int i = 0; i < matches.Count; i++)
{
   var group = matches[i].Groups["token"];
   Console.WriteLine("Token={0}, Index={1}, Length={2}", group.Value, group.Index, group.Length);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...