C# Match (System.Text.RegularExpressions)

  • Автор темы Автор темы Dimionix
  • Дата начала Дата начала

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Реакции
3 140
Баллы
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.
можно так, правда здесь в цикле вытаскиваются значения из коллекции, которые в дальнейшем обрабатываются
Код:
Развернуть Свернуть Копировать
            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
можно так, правда здесь в цикле вытаскиваются значения из коллекции, которые в дальнейшем обрабатываются
Да с циклами нет проблем, не хочу я их в данном случае использовать.
 
а по другому. мне кажется у вас и не получится, так как reg1.Matches(text), загоняет всё в коллекцию и вам волей, не волей необходимо перебрать эту коллекцию по условию, перед записью в список.
 
  • Оценить
Реакции: Dimionix
а по другому. мне кажется у вас и не получится, так как reg1.Matches(text), загоняет всё в коллекцию и вам волей, не волей необходимо перебрать эту коллекцию по условию, перед записью в список.
Вот и создал тему, может кто-нибудь знает и все-таки есть какое-то более изящное решение.
where там прописать нельзя?
Пробовал, но нефига не получается или не пойму как правильно его тут использовать можно.
 
я такими запросами не пользовался. Может так
from Match match in reg1.Matches(text) select reg2.Match(match.Value).Value where match.Value!=""
Вот что-то близко, но к сожалению не правильно так((
 
если хотите через 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
ток без Console.WriteLine(otvet)., это я в студии работу проверил)
 
  • Оценить
Реакции: Dimionix
в ответе получите все строки по второй регулярки без пустых строк
 
  • Оценить
Реакции: Dimionix
а так?
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 устраивает.
 
@doc, спасибо за подсказку! Немного изменил твой код и все стало работать идеально:
Код:
Развернуть Свернуть Копировать
list.AddRange(from Match match in reg1.Matches(text)
            where reg2.Match(match.Value).Value != ""
            select reg2.Match(match.Value).Value);
@patlat, и Вам спасибо большое за помощь! Такое решение вполне подходит, foreach устраивает.
))) да они @ такие!
 
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);
 
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

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