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


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

10.17.7.158#ПЧ-11#НОД1@10.20.123.142#ПЧ-14#НОД1@10.17.8.50#ПЧ-2 Орехово#НОД1@10.23.141.32#ПЧ-9#НОД1@10.17.19.138#ПЧ-1#НОД1@10.23.68.148#ПЧ-32#НОД1@10.20.220.82#ПЧ-33#НОД1@10.23.93.150#АЛЕКС доввод#НОД1@10.17.31.145#ПЧ-2#НОД1@10.17.76.35#М-ПАВ доввод#НОД1@10.20.246.37#ОРЕХ. доввод#НОД1@10.20.96.15#ЛОСИН доввод#НОД1@10.17.0.225#М-ЯР. доввод#НОД1@10.17.27.81#МТКУР доввод#НОД1@10.20.248.229#УЗУНВ доввод#НОД1@10.23.112.11#ОЖЕР. доввод#НОД1@10.17.16.54#МПКУР.Ю доввод bad#НОД1@10.17.16.32#МПКУР.Г доввод#НОД1@10.17.25.148#ШЧ-2#НОД1@10.17.19.163#ШЧ-2 (2)#НОД1@10.17.20.6#ШЧ-10#НОД1@10.17.12.21#ШЧ-10 (СЦБ)#НОД1@10.17.5.132#ШЧ-4 (СЦБ)#НОД1@10.17.22.6#ШЧ-4 (Связь)#НОД1@10.17.65.31#ШЧ-13#НОД1@10.17.65.48#ШЧ-13 (2)#НОД1@10.17.83.2#ШЧ-13 (связь)#НОД1@10.17.184.215#ПЧ-18#НОД6@10.17.103.160#ПЧ-12#НОД6@10.17.108.49#ПЧ-16#НОД6@10.17.105.14#ПЧ-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#НОД1@10.20.123.142#ПЧ-14#НОД1@10.17.8.50#ПЧ-2 Орехово#НОД1@10.23.141.32#ПЧ-9#НОД1@10.17.19.138#ПЧ-1#НОД1@10.23.68.148#ПЧ-32#НОД1@10.20.220.82#ПЧ-33#НОД1@10.23.93.150#АЛЕКС доввод#НОД1@10.17.31.145#ПЧ-2#НОД1@10.17.76.35#М-ПАВ доввод#НОД1@10.20.246.37#ОРЕХ. доввод#НОД1@10.20.96.15#ЛОСИН доввод#НОД1@10.17.0.225#М-ЯР. доввод#НОД1@10.17.27.81#МТКУР доввод#НОД1@10.20.248.229#УЗУНВ доввод#НОД1@10.23.112.11#ОЖЕР. доввод#НОД1@10.17.16.54#МПКУР.Ю доввод bad#НОД1@10.17.16.32#МПКУР.Г доввод#НОД1@10.17.25.148#ШЧ-2#НОД1@10.17.19.163#ШЧ-2 (2)#НОД1@10.17.20.6#ШЧ-10#НОД1@10.17.12.21#ШЧ-10 (СЦБ)#НОД1@10.17.5.132#ШЧ-4 (СЦБ)#НОД1@10.17.22.6#ШЧ-4 (Связь)#НОД1@10.17.65.31#ШЧ-13#НОД1@10.17.65.48#ШЧ-13 (2)#НОД1@10.17.83.2#ШЧ-13 (связь)#НОД1@10.17.184.215#ПЧ-18#НОД6@10.17.103.160#ПЧ-12#НОД6@10.17.108.49#ПЧ-16#НОД6@10.17.105.14#ПЧ-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#НОД1@10.20.123.142#ПЧ-14#НОД1@10.17.8.50#ПЧ-2 Орехово#НОД1@10.23.141.32#ПЧ-9#НОД1@10.17.19.138#ПЧ-1#НОД1@10.23.68.148#ПЧ-32#НОД1@10.20.220.82#ПЧ-33#НОД1@10.23.93.150#АЛЕКС доввод#НОД1@10.17.31.145#ПЧ-2#НОД1@10.17.76.35#М-ПАВ доввод#НОД1@10.20.246.37#ОРЕХ. доввод#НОД1@10.20.96.15#ЛОСИН доввод#НОД1@10.17.0.225#М-ЯР. доввод#НОД1@10.17.27.81#МТКУР доввод#НОД1@10.20.248.229#УЗУНВ доввод#НОД1@10.23.112.11#ОЖЕР. доввод#НОД1@10.17.16.54#МПКУР.Ю доввод bad#НОД1@10.17.16.32#МПКУР.Г доввод#НОД1@10.17.25.148#ШЧ-2#НОД1@10.17.19.163#ШЧ-2 (2)#НОД1@10.17.20.6#ШЧ-10#НОД1@10.17.12.21#ШЧ-10 (СЦБ)#НОД1@10.17.5.132#ШЧ-4 (СЦБ)#НОД1@10.17.22.6#ШЧ-4 (Связь)#НОД1@10.17.65.31#ШЧ-13#НОД1@10.17.65.48#ШЧ-13 (2)#НОД1@10.17.83.2#ШЧ-13 (связь)#НОД1@10.17.184.215#ПЧ-18#НОД6@10.17.103.160#ПЧ-12#НОД6@10.17.108.49#ПЧ-16#НОД6@10.17.105.14#ПЧ-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)