Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > RegExp tokenizer


Автор: azesmcar 23.5.2010, 16:16
Добрый день,

Регулярные выражения всегда были моим слабым местом, никак руки не доходят изучить как следует.
Нужна помощь в создании регулярного выражения, для разделения текста на токены. Разделителем служат все символы, кроме a-z, A-Z. Т.е. все, кроме alphabetical символов, ума не приложу как это сделать
Например:
LpZaq2Wd32Da
[0] = LpZaq
[1] = Wd
[2] = Da

можно конечно же ручками, но зачем? Мне кажется регулярками это сделать гораздо проще.

Заранее большое спасибо.

Автор: diadiavova 23.5.2010, 21:31
Если нужна регулярка для токена, то так
Код

[a-zA-Z]
А если для разделителя - так
Код

[^a-zA-Z]

При включении опции IgnoreCase ещё проще
Код

[a-z]

и
Код

[^a-z]
соответственно.


Или я чего-то не паонял? smile 

Автор: azesmcar 24.5.2010, 06:31
Код

        public static void ParseLine(string inputT)
        {
            String[] list = Regex.Split(inputT, @"[a-zA-Z]");
            foreach (String s in list)
            {
                Console.WriteLine(s);
            }
        }

        static void Main(string[] args)
        {
            ParseLine("Hello world");
        }

выводит пустые строки, или я что-то не так написал? Насколько я могу судить о регулярках это не совсем то, что нужно, но я не уверен..

в общем нужно разделить текст на слова, разделитель любое количество любых символов кроме a-z, A-Z. Т.е. словами явлется набор символов a-z, A-Z, остальное - разделитель.

Автор: diadiavova 24.5.2010, 10:34
Если используется разделитель и он может состоять из любого количества символов, тогда ему нужен квантификатор +. Кроме того, ты использовал регулярку для токена в качестве разделителя, поэтому и получил список разделителей.
Код

            String[] list = Regex.Split(inputT, @"[^a-zA-Z]+");



Добавлено через 41 секунду
Цитата(azesmcar @  24.5.2010,  07:31 Найти цитируемый пост)
 Насколько я могу судить о регулярках это не совсем то, что нужно

Оно самое.

Автор: mrbrooks 24.5.2010, 10:40
Цитата(azesmcar @  23.5.2010,  17:16 Найти цитируемый пост)
LpZaq2Wd32Da
[0] = LpZaq
[1] = Wd
[2] = Da

 я бы так зафигачил и не парился:

Код

        static void Main(string[] args)
        {
            var res = Regex.Matches("LpZaq2Wd32Da", "[a-z]+", RegexOptions.IgnoreCase);
            foreach (Match item in res)
            {
                Console.WriteLine(item.Value);  
            }
            Console.Read();
        }


Добавлено через 1 минуту и 6 секунд
хотя, как я понимаю, diadiavova к этому и вел

Автор: azesmcar 24.5.2010, 13:07
diadiavova

Теперь понятно, я почему-то думал в сторону split а не matches.

Спасибо.

Цитата(mrbrooks @  24.5.2010,  10:40 Найти цитируемый пост)
 я бы так зафигачил и не парился:

так и сделал smile 
благодарю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)