2014-09-22 124 views
-2

我有一個包含動態模式的字符串,它沒有特定的順序。在字符串中查找數字

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

爲了進一步瞭解,我已經打破下來到什麼是關係到什麼:

content: ($$)^1 

title: ($$)^15 

url: ($$)^20 

所以在我的字段名(內容,標題,URL等)的列表循環時,我需要查看該字段是否存在於字符串中。如果是這樣,我必須在胡蘿蔔後立即提取數字。

在內容的情況下,它將是1. 標題,15.等等等等。

+0

@Nick - 我想你越來越近,但並不完全清楚。有什麼不明白的是:一個字符串會有三個不同的順序嗎?例如,一個字符串會有'content:1111,title:15151515,url:20202020',另一個字符串有'url:20202020,title:15151515,content:1111'?田地有時會失蹤?例如,'url:20202020'。請提供您的數據樣本。 – jww 2014-09-22 22:06:28

+0

@jww回答你的問題,是的。它可以以任何順序。但是這個數字只能是2位數。因此不高於99.數據樣本是上面的第一個代碼塊。對於內容我想提取「1」,對於標題,我想提取「15」。這個數字可能會有所不同,但不會超過兩位數。此外,它將始終默認爲1. – Nick 2014-09-23 16:04:55

回答

2

使用正則表達式:

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 2014-09-23 17:50:00

1

你可以像這樣提取數字。

\(\${2}\)\^(\d+) 
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 2014-09-22 21:16:13

+0

@brz:正則表達式一般都很好,但避免它是我的興趣之一,這只是我個人的不喜歡。我發現一切都比正則表達式更可讀,字符串方法也更有效率。 – 2014-09-22 21:18:01