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

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

我已经在我的问题中编辑了我尝试过的内容。 - Geek
但它并没有给我精确的模式。 - Geek
3个回答

4

看起来您想在#;后面的空格处拆分,而不是在#;本身处拆分。C#提供了任意长度的回溯,这使得这个过程非常容易。实际上,您应该先将#;替换为#?:

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/

如果你担心你的输入可能已经包含了其他你不想分割的#?,当然可以先进行拆分(使用模式中的#;),然后循环遍历子字符串并在循环内调用替换函数。

@Geek 我认为我们现在可以清理那些注释了 ;) - Martin Ender
为了更好地帮助他人,你可以随意编辑我最初提出的问题。 - Geek

1
如果这些是常量字符串,您可以直接使用String.Substring。这将需要您计算字母,以提供正确的参数,但它会起作用。
string string1 = teststring.Substring(0, 26).Replace(";","?");

如果它们不是这样,事情会变得很复杂。你几乎可以使用“”作为分隔符拆分,但是您的网站名称中有一个空格。您的数据子字符串中是否有任何常量特征,例如域结尾(即先 .com,然后 .de 等)或类似的内容?

感谢您的回复,我已经更新了我的问题,并提供了所需的模式。 - Geek

1

如果您对输入格式有任何控制,您可能希望将其更改为易于解析的格式,例如使用除空格之外的其他分隔符来分隔项目。

如果无法更改此格式,为什么不在代码中实现拆分呢?虽然它不像使用正则表达式那样简短,但对于读者来说可能更容易理解,因为逻辑是直接的。

这几乎肯定会更快,并且在内存使用方面更便宜。

解决此问题的代码示例:

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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接