簡體   English   中英

試圖從一個長字符串中取出一個 url

[英]Trying to take a url out of a long string

我有一長串文本,我從一個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(" ")));

但是它似乎不起作用。 有人可以解釋我哪里出錯了嗎? 謝謝你。

URL 可以包含許多字符,但不能包含空格,因此使用正則表達式可能會更成功。

一個簡單的模式會說“以 http 開頭,后跟超過 1 個非空白字符”

var regex = new Regex(@"http[^\s]+");
Console.WriteLine(regex.Match(sql));

現場示例: https ://rextester.com/BOV71354

在您的嘗試中, sql.IndexOf(" ")將匹配第一次出現的空格,在您的示例中它位於索引 5(在Thank you中)。

您必須在第一次出現http之后查看第一次出現的換行符:

var startIndex = sql.IndexOf("http", StringComparison.Ordinal);
var endIndex = sql.IndexOf('\r', startIndex); // maybe '\n' or ' '

Substring第二個參數是長度而不是索引,正確的代碼是:

var url = sql.Substring(startIndex, endIndex - startIndex - 1);

但最干凈的方法是使用regexp

// Assuming there is only one url and it fit alone on a single line.
var regex = new Regex(@"^http.*\r?$", RegexOptions.Multiline);
var match = regex.Match(s);
if (match.Success)
{
    var url = match.Value;
}

此解決方案假設只有一個 url

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

https://dotnetfiddle.net/tnUTPk

我不太確定你所說的 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”將是“ http://localhost:5692/Public/LogonSetPassword.aspx?activationLinkId=603fa657-9460-4417-adc2-7bcad0416c3e

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;

https://dotnetfiddle.net/Cz16QR

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM