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


Автор: DenWPF 14.2.2010, 16:17
Вообщем я использую очень ну удобную функцию самописную что бы вытащить все что находиться между двух элементов к прримеру,
вытащить на странице все: начинается на "name@" и заканчивается на ";". 
моя функция принимает string, RegEx_start, RegEx_end и взоращается List<string> со всеми значениями что находятся между этих строчек.

Автор: Dobermann 14.2.2010, 16:24
Поздравляю! И в чем проблема?!

Автор: DenWPF 14.2.2010, 16:50
Код

Regex rq = new Regex("user=");
        Regex rq1 = new Regex("'");
        private List<string> GetUsers(string str)
        {

            List<string> ls = new List<string>();
            int p1 = 0;
            int p2 = 0;
            while (p1 < str.Length)
            {
                Match m = rq.Match(str, p1);
                if (m.Success)
                {
                    p1 = m.Index + 5;
                    Match m1 = rq1.Match(str, p1);
                    if (m1.Success)
                    {
                        p2 = m1.Index;
                        if (str.Substring(p1, p2 - p1) == "")
                        {
                        }
                        else ls.Add(str.Substring(p1, p2 - p1));
                    }
                }
                else break;
            }
            return ls;
        }

довольно большой код, может что то есть более лучшего?

Автор: uranpro 14.2.2010, 17:14
DenWPF, а для чего это нужно ? в каких целях используется ?

Автор: wester 14.2.2010, 19:39
быстренько набросал код. работает но в производительности незнаю каков
Код

String[] words = {@"arhedhethrethname@ehrgeh;@",
                                 @"sdgdfgdsfhdgfhname@sdfsdfsdf;" }; // массив слов



            var mathRes= new List<string>(); //лист куда складываем все попадания
            const string pattern = @"name@\w+;"; // паттерн
            Match match;
            foreach (var word in words)
            {
                match = Regex.Match(word, pattern);
                if(match.Success)
                {
                    var item =
                        (new StringBuilder() {Capacity = 0}.Append(match.Value).Remove(0, 5).Replace(";",""))
                            .ToString();
                                    
                    mathRes.Add(item);
                    match.NextMatch();
                }

            }

Автор: DenWPF 14.2.2010, 20:12
нет, даётся строка одна! в ней много элементов найти надо.

Автор: wester 14.2.2010, 20:22
Код

String word = @"dfdfh@name@12;dhfdshdhnam6@name@34;";
while (match.Success)
            {
                var item =
                        (new StringBuilder {Capacity = 0}.Append(match.Value).Remove(0, 5).Replace(";", ""))
                            .ToString();
                mathRes.Add(item);
                match=  match.NextMatch();
            }


Автор: DenWPF 14.2.2010, 21:44
а можно что бы с любыми значениями ? просто я не понимаю какие переменные за что отвечают 
Remove(0, 5) ?  размер то первого вхождения разные могут быть..

Автор: wester 14.2.2010, 22:36
Цитата

а можно что бы с любыми значениями ?

да запросто

Цитата

просто я не понимаю какие переменные за что отвечают 
Remove(0, 5) 

Код

var item =
                        (new StringBuilder {Capacity = 0}.Append(match.Value).Remove(0, 5).Replace(";", ""))
                            .ToString();

1.создаю обьект StringBuilder
2.вставляю в него результат попадания
3.Удаляю первые пять символов с начала , потом с конца символ ;
(например в первое попадание в Match.Value будет храниться "name@12;" я удаляю первая пять символов , а потом удаляю последний символ

Цитата

размер то первого вхождения разные могут быть..

не очень понял. Ну да разные.просто я извлекаю все что лежит между name@ и ;

Автор: DenWPF 14.2.2010, 23:23
вместо 5 - надо размер вхождения первого.
Replace(";", "") - зачем?

Автор: wester 14.2.2010, 23:28
Цитата

вместо 5 - надо размер вхождения первого.

развер "name@" ? ну сделай две переменные "name@" и "\w+;" потом получи длину первой , 

Цитата

Replace(";", "") - зачем? 

здесь в результате мы избавляемся от последнего символа
можно было сделать Remove() по сути одно и то же

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