C# 试图从长字符串中提取url

C# 试图从长字符串中提取url,c#,string,substring,indexof,C#,String,Substring,Indexof,我有一个很长的文本字符串,我已经从sql表中分离出来,并将其转换为字符串 Thank you for your request. Please click the following link to reset your password: http://localhost:5692/Public/LogonSetPassword.aspx?activationLinkId=603fa657-9460-4417-adc2-7bcad0416c3e If clicking on the li

我有一个很长的文本字符串,我已经从sql表中分离出来,并将其转换为字符串

Thank you for your request.   
Please click the following link to reset your password:
http://localhost:5692/Public/LogonSetPassword.aspx?activationLinkId=603fa657-9460-4417-adc2-7bcad0416c3e
If clicking on the link does not work then please copy and paste it directly into your browser address bar
我现在试着只取出url并将其放入另一个字符串中。我需要从“http”中获取它,并使用唯一id后面的空格结束它

我试过:

string activationUrl=sql.Substring(sql.IndexOf(“http”),sql.IndexOf(“http”)

然而,它似乎不起作用。 有人能解释一下我哪里出错了吗?
谢谢。

URL可以包含许多字符,但不能包含空格,因此使用正则表达式可能会更成功

一个简单的模式是“以http开头,后跟1个以上的非空白字符”


实时示例:

在您的尝试中,
sql.IndexOf(“”
将匹配第一次出现的空格,在您的示例中,它位于索引5处(在
中,谢谢

您必须在
http
第一次出现之后查看新行的第一次出现:

var startIndex = sql.IndexOf("http", StringComparison.Ordinal);
var endIndex = sql.IndexOf('\r', startIndex); // maybe '\n' or ' '
第二个参数是长度而不是索引,正确的代码是:

var url = sql.Substring(startIndex, endIndex - startIndex - 1);
但最干净的方法是使用:


此解决方案假定只有一个url

var indexOfHttp = sql.IndexOf("http");
var strStartingFromHttp = sql.Substring(indexOfHttp);
var activationUrl = strStartingFromHttp.Substring(0 , strStartingFromHttp.IndexOf('\n'));

我不太清楚你所说的url是什么意思。 您正在使用的代码从全文中找到的第一个“http”实例开始,然后转到字符串中“”的第一个索引。 “http”的第一个实例位于第三行,而“”的第一个实例位于“谢谢”之后的第一行

如果url总是在一个单独的行上,并且您只有一个url,您可以简单地将字符串按新行拆分,并检查该行是否以http开头:

string url = null;
foreach (string line in sql.Split('\n'))
{
    if (line.ToLower().StartsWith("http"))
    {
        url = line;
        break;
    }
}
if (url != null) //You found a url
在这种情况下,“url”将为“”


这里“似乎不起作用”是什么意思?会发生什么?什么没有?你的url后面没有空格,有一个换行符。是否总是这样(使答案更容易)或者可能存在一些随机空白(如空格、制表符、换行符等),您甚至不需要这些
strStartingFromHttp
Substring
IndexOf
都允许一个start index参数,因此在
Substring
IndexOf
调用中,您可以在最后一行中直接将
indexOfHttp
填充到该参数中。不,您俩都错了,请用您的notes@Ali不是说它不起作用。只说中间操作是不必要的。将最后一行替换为
String activationUrl=sql.Substring(indexOfHttp,sql.IndexOf('\n',indexOfHttp)-indexOfHttp)
您将看到它从不需要
strStartingFromHttp
字符串。虽然理想情况下,您应该在
-1
上添加一些检查,以确保它不会在不包含以
\n
@Orace结尾的url的字符串上崩溃和烧坏。第一个参数始终是起始索引。他给出了一个长度,这应该是第二个论点。所以0是必需的。@Ali我已经尝试过了,但是我得到了以下错误“StartIndex不能小于零”,这不是正则表达式所做的。您的正则表达式匹配“固定字符串
http
,后跟任意字符,后跟一个非空白”。
http[^\s]+
不是更有意义吗?当我点击'var endIndex'@Cbear时,我得到了一个“索引超出范围”错误,可能是因为
http
没有找到,
startIndex
-1
,使用
IndexOf
你必须检查所有这些,而regex解决方案有一个
Success
字段。
var indexOfHttp = sql.IndexOf("http");
var strStartingFromHttp = sql.Substring(indexOfHttp);
var activationUrl = strStartingFromHttp.Substring(0 , strStartingFromHttp.IndexOf('\n'));
string url = null;
foreach (string line in sql.Split('\n'))
{
    if (line.ToLower().StartsWith("http"))
    {
        url = line;
        break;
    }
}
if (url != null) //You found a url
var regex = new Regex(@"https?://(www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)", RegexOptions.Compiled);
var activationUrl = regex.Match(sql)?.Value;