csrss Ответов: 2

Как составить список из регулярных выражений


Привет.
У меня есть простая строка, которая выглядит так:
string test = "token1 token2 token3 complex token";

Мне нужно разбить эту строку на токены с помощью регулярного выражения. Имена токенов всегда одинаковы, но могут быть, скажем, такими: token4, token5, complex token2 и т. д.

Что я уже пробовал:

Я попытался сделать следующее:
var result = Regex.Matches(test, "(token1) (token2) (complex token)").Cast<Match>().Select(m => m.Value).ToList()

Это не работает. Список либо пуст, либо содержит одну строку, которая является коллекцией всех токенов, например: token1 token2 complex token. Но мне нужно, чтобы он содержал для этого случая 3 строки, каждая из которых будет токеном.
Может кто-нибудь помочь, пожалуйста?
С уважением

2 Ответов

Рейтинг:
13

Richard Deeming

Ваше регулярное выражение будет соответствовать только литеральной строке "token 1 token 2 complex token" Вы получите несколько совпадений только в том случае, если ваша входная строка содержит эту литеральную строку несколько раз.

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

var result = Regex.Matches(test, @"(token1)|(token2)|(complex token)").Cast<Match>().Select(m => m.Value).ToList();
Язык Регулярных Выражений - Краткий Справочник | Microsoft Docs[^]


Pete O'Hanlon

И это единственный способ решить проблему. Мой 5.

Maciej Los

5ed!

Рейтинг:
1

honey the codewitch

я думаю, вам нужен токенизатор.

Рискуя заткнуть мои собственные предложения попробуйте вот это: Rolex (перезагрузка): генератор лексеров с поддержкой Unicode в C#[^]

// rolex lex spec
complexToken = 'complex token[0-9]+'
token = '[A-Za-z][A-Za-z0-9]*'
int = '\-?[0-9]*' // just an example
ws<hidden> = '[ \t]+' // hide whitespace


Затем вы можете токенизировать, делая это

foreach(var token in new MyTokenizer("my test string"))
   Console.WriteLine("{0}: {1} at {2}",tok.SymbolId,tok.Value,tok.Position)


Он создает один файл без каких-либо зависимостей. Вход есть IEnumerable<char>, "выход" - это IEnumerable<Token>

если вам это нужно поверх файла, используйте вот это IO: небольшая потоковая библиотека ввода-вывода и UTF-32[^]