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
4

3 回答 3

4

所以这看起来你想在 a 之后的空间上#;拆分,而不是在#;自身上拆分。C# 提供了任意长度的lookbehinds,这很容易。实际上,您可能应该先替换#;with #?

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并在循环内进行替换调用。

于 2012-12-12T23:25:47.680 回答
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;
    }
}
于 2012-12-13T00:10:54.820 回答
1

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

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

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

于 2012-12-12T23:24:41.460 回答