2012-12-12 274 views
3

我有以下主要字符串,其中包含鏈接名稱和鏈接URL。名稱和網址與#;相結合。我想每個鏈接(名稱和URL即My web#?http://www.google.com)的字符串,見下面的例子從一個主字符串獲取不同的子字符串

string teststring = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/"; 

,我想使用的任何字符串函數來得到三個不同的字符串:

  • 我的網頁#? http://www.google.com
  • 我的WEB2.0#HTTP://www.bing.se
  • 手冊#HTTP://www.books.de
+0

我已經編輯了什麼,我已經在我的問題 – Geek

+0

到目前爲止已經試過,但它沒有給我確切的模式 – Geek

回答

4

所以這看起來像你想要在#;之後的空間拆分,而不是拆分在#;本身。 C#提供了任意長度的lookbehinds,這很容易。事實上,你應該做的更換#;#?第一:

string teststring = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/"; 
teststring = Regex.Replace(teststring, @"#;", "#?"); 
string[] substrings = Regex.Split(teststring, @"(?<=#\?\S*)\s+"); 

就是這樣:

foreach(var s in substrings) 
    Console.WriteLine(s); 

Output: 
My web#?http://www.google.com 
My Web2#?http://www.bing.se 
Handbooks#?http://www.books.se/ 

如果你擔心你的輸入可能已經包含其他#?你不想要分割,你當然可以先分割(在模式中使用#;),然後在substrings上循環並在循環內部進行替換調用。

+0

你是一個極客和古魯人! – Geek

+0

剩下的唯一東西就是將它標記爲答案:D – Geek

+0

@Geek我認爲我們現在可以清理這些評論;) –

1

如果這些是常量字符串,則可以使用String.Substring。這將要求你計算字母,這是一個麻煩,爲了提供正確的參數,但它會工作。

string string1 = teststring.Substring(0, 26).Replace(";","?"); 

如果他們不是,事情變得複雜。除了您的網站名稱有空格之外,您幾乎可以使用「」作爲分隔符進行分割。數據中的任何子字符串是否具有不變的特徵,例如域名結尾(即第一個.com,然後是.de等)或類似的東西?

+0

感謝您的輸入和我已經用需要的模式更新了我的問題。 – Geek

1

如果您對輸入格式有任何控制權,您可能需要將其更改爲易於解析,例如通過在空間以外的項之間使用另一個分隔符。

如果這種格式無法更改,爲什麼不實施分割代碼?這並不像使用RegEx那麼簡短,但對於讀者來說可能更容易理解,因爲邏輯非常簡單。

就內存使用而言,這幾乎肯定會更快,更便宜。

代碼,解決了這將是一個例子:

static void Main(string[] args) 
{ 
    var testString = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/"; 

    foreach(var x in SplitAndFormatUrls(testString)) 
    { 
     Console.WriteLine(x); 
    } 
} 

private static IEnumerable<string> SplitAndFormatUrls(string input) 
{ 
    var length = input.Length; 
    var last = 0; 
    var seenSeparator = false; 
    var previousChar = ' '; 

    for (var index = 0; index < length; index++) 
    { 
     var currentChar = input[index]; 

     if ((currentChar == ' ' || index == length - 1) && seenSeparator) 
     { 
      var currentUrl = input.Substring(last, index - last); 
      yield return currentUrl.Replace("#;", "#?"); 

      last = index + 1; 
      seenSeparator = false; 
      previousChar = ' '; 
      continue; 
     } 

     if (currentChar == ';' && previousChar == '#') 
     { 
      seenSeparator = true; 
     } 

     previousChar = currentChar; 
    } 
} 
相關問題