从一个主字符串中获取不同的子字符串

时间:2012-12-12 23:17:16

标签: c# regex string substring

我有以下主要字符串,其中包含链接名称和链接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#?http://www.bing.se
  • 手册#HTTP://www.books.de

3 个答案:

答案 0 :(得分: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并在循环内进行替换调用。

答案 1 :(得分:1)

如果这些是常量字符串,则可以使用String.Substring。这将要求您计算字母,这是一个麻烦,以提供正确的参数,但它将起作用。

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

如果不是,情况会变得复杂。除了您的站点名称有空格外,您几乎可以使用“”作为分隔符进行拆分。您的数据中的任何子字符串是否具有常量功能,例如域名结尾(即首先.com,然后是.de等)或类似内容?

答案 2 :(得分: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;
    }
}