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


Автор: fromrus 11.2.2009, 11:21
есть такая вот строка:

10.17.7.158#ПЧ-11#НОД[email protected]#ПЧ-14#НОД[email protected]#ПЧ-2 Орехово#НОД[email protected]#ПЧ-9#НОД[email protected]#ПЧ-1#НОД[email protected]#ПЧ-32#НОД[email protected]#ПЧ-33#НОД[email protected]#АЛЕКС доввод#НОД[email protected]#ПЧ-2#НОД[email protected]#М-ПАВ доввод#НОД[email protected]#ОРЕХ. доввод#НОД[email protected]#ЛОСИН доввод#НОД[email protected]#М-ЯР. доввод#НОД[email protected]#МТКУР доввод#НОД[email protected]#УЗУНВ доввод#НОД[email protected]#ОЖЕР. доввод#НОД[email protected]#МПКУР.Ю доввод bad#НОД[email protected]#МПКУР.Г доввод#НОД[email protected]#ШЧ-2#НОД[email protected]#ШЧ-2 (2)#НОД[email protected]#ШЧ-10#НОД[email protected]#ШЧ-10 (СЦБ)#НОД[email protected]#ШЧ-4 (СЦБ)#НОД[email protected]#ШЧ-4 (Связь)#НОД[email protected]#ШЧ-13#НОД[email protected]#ШЧ-13 (2)#НОД[email protected]#ШЧ-13 (связь)#НОД[email protected]#ПЧ-18#НОД[email protected]#ПЧ-12#НОД[email protected]#ПЧ-16#НОД[email protected]#ПЧ-17#НОД6

Чтобы не разбираться в этом скажу,что данные тут сгруппированы следующим образом:

"цифры"#строка1#строка2@тоже самое@тоже самое

Дело в том,что строка2 может повторяться сколь угодно раз,как и строка1.
мне нужно вытащить все НЕОДИНАКОВЫЕ вхождения строк строка1 и строка2 и установить между ними соответствие-из текста видно,что каждой строке2 соответсвует много строка1,т.е. в результате ыввод должен быть следующий:
НОД1-"все что соответствует НОД1"
НОД6-"все что соответствует НОД6"
НОД N-"все что соответствует НОД N"

Помогите плз,а то уже с циклами замучился(алгоритмист из меня не очень)
P.S.как вы поняли здесь представлена лишь небольшая часть текста для экономии места

Добавлено через 6 минут и 21 секунду
в данном случае для сопоставления у меня есть тип NOD и у него поле LIST<string>,которое представляет все строки,ассоциированные для этого нода

Автор: Rififi 11.2.2009, 13:50
Код
var s = ...;
var re = new Regex(@"(\d+\.\d+\.\d+\.\d+)\#([^\#]+)\#([^\#]+)(@|$)", RegexOptions.Compiled);
            

foreach (Match mc in re.Matches(s))
{
    var number = mc.Groups[1];
    var s1 = mc.Groups[2];
    var s2 = mc.Groups[3];
}

в цикле вытаскиваешь значения числа и строка1, строка 2 и делаешь с ними что хочешь.

Автор: source777 11.2.2009, 17:05
Цитата(fromrus @  11.2.2009,  11:21 Найти цитируемый пост)
Помогите плз,а то уже с циклами замучился(алгоритмист из меня не очень)
Да тут алгоритм то вполне простой: найти все совпадения и сгруппировать их нужным образом:

Код

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace RegexTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string text = @"10.17.7.158#ПЧ-11#НОД[email protected]#ПЧ-14#НОД[email protected]#ПЧ-2 Орехово#НОД[email protected]#ПЧ-9#НОД[email protected]#ПЧ-1#НОД[email protected]#ПЧ-32#НОД[email protected]#ПЧ-33#НОД[email protected]#АЛЕКС доввод#НОД[email protected]#ПЧ-2#НОД[email protected]#М-ПАВ доввод#НОД[email protected]#ОРЕХ. доввод#НОД[email protected]#ЛОСИН доввод#НОД[email protected]#М-ЯР. доввод#НОД[email protected]#МТКУР доввод#НОД[email protected]#УЗУНВ доввод#НОД[email protected]#ОЖЕР. доввод#НОД[email protected]#МПКУР.Ю доввод bad#НОД[email protected]#МПКУР.Г доввод#НОД[email protected]#ШЧ-2#НОД[email protected]#ШЧ-2 (2)#НОД[email protected]#ШЧ-10#НОД[email protected]#ШЧ-10 (СЦБ)#НОД[email protected]#ШЧ-4 (СЦБ)#НОД[email protected]#ШЧ-4 (Связь)#НОД[email protected]#ШЧ-13#НОД[email protected]#ШЧ-13 (2)#НОД[email protected]#ШЧ-13 (связь)#НОД[email protected]#ПЧ-18#НОД[email protected]#ПЧ-12#НОД[email protected]#ПЧ-16#НОД[email protected]#ПЧ-17#НОД6";

            Regex regExp = new Regex(@"([\d.]+)\#([^\#]+)\#([^\@]+)", RegexOptions.Compiled);
            Dictionary<string, List<string>> res = new Dictionary<string, List<string>>();
            foreach (Match m in regExp.Matches(text))
            {
                string val = m.Groups[2].Value;
                string node = m.Groups[3].Value;
                if (!res.ContainsKey(node))
                    res[node] = new List<string>();

             res[node].Add(val);
            }
            foreach(string key in res.Keys)
            {
                Console.WriteLine(key + ":");
                foreach(string val in res[key])
                    Console.WriteLine("\t"+val);
            }
            
            Console.ReadLine();
        }
    }
}


Добавлено через 2 минуты и 58 секунд
регулярку можно ещё упростить до @"([\d.]+)\#(.+?)\#(.+?)(@|$)"

Автор: fromrus 11.2.2009, 17:27
благодарю,уже пошел учить регулярки

Автор: source777 11.2.2009, 18:04
Кстати в данном примере ценность применения регулярок весьма сомнительна, достаточно:
Код

        public static void Main(string[] args)
        {
            string text = @"10.17.7.158#ПЧ-11#НОД[email protected]#ПЧ-14#НОД[email protected]#ПЧ-2 Орехово#НОД[email protected]#ПЧ-9#НОД[email protected]#ПЧ-1#НОД[email protected]#ПЧ-32#НОД[email protected]#ПЧ-33#НОД[email protected]#АЛЕКС доввод#НОД[email protected]#ПЧ-2#НОД[email protected]#М-ПАВ доввод#НОД[email protected]#ОРЕХ. доввод#НОД[email protected]#ЛОСИН доввод#НОД[email protected]#М-ЯР. доввод#НОД[email protected]#МТКУР доввод#НОД[email protected]#УЗУНВ доввод#НОД[email protected]#ОЖЕР. доввод#НОД[email protected]#МПКУР.Ю доввод bad#НОД[email protected]#МПКУР.Г доввод#НОД[email protected]#ШЧ-2#НОД[email protected]#ШЧ-2 (2)#НОД[email protected]#ШЧ-10#НОД[email protected]#ШЧ-10 (СЦБ)#НОД[email protected]#ШЧ-4 (СЦБ)#НОД[email protected]#ШЧ-4 (Связь)#НОД[email protected]#ШЧ-13#НОД[email protected]#ШЧ-13 (2)#НОД[email protected]#ШЧ-13 (связь)#НОД[email protected]#ПЧ-18#НОД[email protected]#ПЧ-12#НОД[email protected]#ПЧ-16#НОД[email protected]#ПЧ-17#НОД6";
            Dictionary<string, List<string>> res = new Dictionary<string, List<string>>();
            string[] arr = text.Split(new char[]{'@'});
            foreach(string s in arr)
            {
                string[] matches = s.Split('#');
                string val = matches[1];
                string node = matches[2];
                if (!res.ContainsKey(node))
                     res[node] = new List<string>();
                
                res[node].Add(val);
            }

            foreach(string key in res.Keys)
            {
                Console.WriteLine(key + ":");
                foreach(string val in res[key])
                    Console.WriteLine("\t"+val);
            }
            
            Console.ReadLine();
        }

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