我有以下主要字符串,其中包含链接名称和链接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/";
我希望使用任何字符串函数获得三个不同的字符串:
答案 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;
}
}