2012-12-12 192 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; 
    } 
} 
相关问题