C# Match (System.Text.RegularExpressions)

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Код:
var list = project.Lists["List"];
string text = "Text";
Regex reg1 = new Regex("reg1");
Regex reg2 = new Regex("reg2");
list.AddRange(from Match match in reg1.Matches(text) select reg2.Match(match.Value).Value);
Код парсит из текста все совпадения по регулярке reg1, а из полученных значений парсит второй регуляркой reg2 и кладет результаты в список.

Проблема в том, что если по регулярке reg2 нет совпадения, то в список записывается пустая строка.

Подскажите, пожалуйста, как избавиться от записи пустых строк на этапе добавления в список без использования цикла. Что можно подправить в коде?
 
  • Спасибо
Реакции: Mikhail B.

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
можно так, правда здесь в цикле вытаскиваются значения из коллекции, которые в дальнейшем обрабатываются
Код:
            string reg1 = "regulyarka";
            string req2 = "regulyarka";
            string vhodnayaStroka = "blabla";

            MatchCollection str = Regex.Matches(vhodnayaStroka, reg1);

            foreach (Match rezul in str)
            {
                if (Regex.IsMatch(rezul.ToString(), req2))
                {
                    peremenaya = Regex.Match(rezul.ToString(), req2).ToString();
                }
               
            }
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
можно так, правда здесь в цикле вытаскиваются значения из коллекции, которые в дальнейшем обрабатываются
Да с циклами нет проблем, не хочу я их в данном случае использовать.
 

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
а по другому. мне кажется у вас и не получится, так как reg1.Matches(text), загоняет всё в коллекцию и вам волей, не волей необходимо перебрать эту коллекцию по условию, перед записью в список.
 
  • Спасибо
Реакции: Dimionix

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
а по другому. мне кажется у вас и не получится, так как reg1.Matches(text), загоняет всё в коллекцию и вам волей, не волей необходимо перебрать эту коллекцию по условию, перед записью в список.
Вот и создал тему, может кто-нибудь знает и все-таки есть какое-то более изящное решение.
where там прописать нельзя?
Пробовал, но нефига не получается или не пойму как правильно его тут использовать можно.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
я такими запросами не пользовался. Может так
from Match match in reg1.Matches(text) select reg2.Match(match.Value).Value where match.Value!=""
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
я такими запросами не пользовался. Может так
from Match match in reg1.Matches(text) select reg2.Match(match.Value).Value where match.Value!=""
Вот что-то близко, но к сожалению не правильно так((
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
а так?
from Match match in reg1.Matches(text) where match.Value!="" select reg2.Match(match.Value).Value
 
  • Спасибо
Реакции: Dimionix

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
если хотите через LINQ то можно так
Код:
            string reg1 = "regylyarka";
            string req2 = "regylyarka";
            string vhodnayaStroka = "blabla";

            MatchCollection str = Regex.Matches(vhodnayaStroka, reg1);

            var per = from Match n in str
                      where Regex.IsMatch(n.ToString(), req2)
                      select n;
            foreach (var otvet in per) Console.WriteLine(otvet);
но опять же здесь форыч
 
  • Спасибо
Реакции: Dimionix

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
ток без Console.WriteLine(otvet)., это я в студии работу проверил)
 
  • Спасибо
Реакции: Dimionix

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
в ответе получите все строки по второй регулярки без пустых строк
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
а так?
from Match match in reg1.Matches(text) where match.Value!="" select reg2.Match(match.Value).Value
@doc, спасибо за подсказку! Немного изменил твой код и все стало работать идеально:
Код:
list.AddRange(from Match match in reg1.Matches(text)
            where reg2.Match(match.Value).Value != ""
            select reg2.Match(match.Value).Value);
@patlat, и Вам спасибо большое за помощь! Такое решение вполне подходит, foreach устраивает.
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
@doc, спасибо за подсказку! Немного изменил твой код и все стало работать идеально:
Код:
list.AddRange(from Match match in reg1.Matches(text)
            where reg2.Match(match.Value).Value != ""
            select reg2.Match(match.Value).Value);
@patlat, и Вам спасибо большое за помощь! Такое решение вполне подходит, foreach устраивает.
))) да они @ такие!
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
C#:
var list = project.Lists["List"];
string text = "Text";
Regex reg1 = new Regex("\\w+.*?");
Regex reg2 = new Regex("\\d+.*?");

list.AddRange(from Match match in reg1.Matches(text)
              where reg2.Match(match.Value).Value != ""
              select match.Value);
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
C#:
var list = project.Lists["List"];
string text = "Text";
Regex reg1 = new Regex("\\w+.*?");
Regex reg2 = new Regex("\\d+.*?");

list.AddRange(from Match match in reg1.Matches(text)
              where reg2.Match(match.Value).Value != ""
              select match.Value);
))) подбиваешь за всеми, чтобы рабочие готовые снипеты были ?
 
  • Спасибо
Реакции: Dimionix

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)