2014-09-22 3 views
-2

У меня есть строка, которая содержит динамический шаблон, который не имеет особого порядка.Найти числа в строке

content: ($$)^1 OR title: ($$)^15 OR url: ($$)^20 

Чтобы лучше понять, я разбила их к тому, что связано с тем, что:

content: ($$)^1 

title: ($$)^15 

url: ($$)^20 

Так что, когда цикл над моим списком имен полей (содержание, название, URL и т.д.), Мне нужно увидеть, существует ли это поле в строке. Если это так, я должен извлечь номер сразу после моркови.

В случае с содержанием, это будет 1. Заголовок, 15. Так далее и т. Д.

+0

@Nick - Я думаю, что вы приближаются, но это не совсем понятно. Что мне непонятно: будет ли строка со всеми тремя в другом порядке? Например, будет ли одна строка иметь содержимое: 1111, заголовок: 15151515, url: 20202020', а в другой строке - url: 20202020, заголовок: 15151515, содержание: 1111'? И иногда поля будут отсутствовать? Например, 'url: 20202020'. Просьба представить образец ваших данных. – jww

+0

@jww Чтобы ответить на ваш вопрос, да. Это может быть в любом порядке. Но число будет только 2 цифры. Таким образом, не выше 99. Образец данных - это первый блок кода выше. Для содержимого я хочу извлечь «1», для названия, я хочу извлечь «15». Это число может меняться, но никогда не будет больше двух цифр. Кроме того, он всегда будет по умолчанию 1. – Nick

ответ

2

Использование Regex:

static void Main() 
     { 
      var input = "content: ($$)^1 OR title: ($$)^15 OR url: ($$)^20"; 
      foreach(Match m in Regex.Matches(input, @"(?<name>\S+): \(\$\$\)\^(?<digits>\d+)")) 
      { 
       Console.WriteLine(m.Groups["name"] + " : " + m.Groups["digits"]); 
      } 
     } 
+0

спасибо, это именно то, что я искал. – Nick

0

Вам не нужно регулярное выражение, не правда ли? Вы можете Split по OR, : и ^:

string input = "content: ($$)^1 OR title: ($$)^15 OR url: ($$)^20"; 
string[] tokens = input.Split(new[] { " OR " }, StringSplitOptions.RemoveEmptyEntries); 
var lookup = tokens.ToLookup(str => str.Split(':')[0].Trim(), str => str.Split('^').Last().Trim()); 
int content = lookup["content"].Select(int.Parse).DefaultIfEmpty(int.MinValue).First(); 
int title = lookup["title"].Select(int.Parse).DefaultIfEmpty(int.MinValue).First(); 
int url = lookup["url"].Select(int.Parse).DefaultIfEmpty(int.MinValue).First(); 

Если это возможно, что число содержит не-цифр, и вы хотите, чтобы пропустить этот недопустимый формат, Fe:

int url = lookup["url"] 
    .Where(num => num.All(Char.IsDigit)) 
    .Select(int.Parse) 
    .DefaultIfEmpty(int.MinValue) 
    .First(); // int.MinValue if non-digits were detected 
+0

Почему не регулярное выражение? – brz

+0

@brz: regex в порядке, но это одно из моих увлечений, чтобы избежать этого, это всего лишь моя личная неприязнь. Я нахожу все более читаемым, чем регулярное выражение, а методы строк также более эффективны. –