Попытка извлечь URL из длинной строки - PullRequest
1 голос
/ 21 января 2020

У меня есть длинная строка текста, которую я выделил из таблицы 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" и завершить его, используя пробел сразу после уникального идентификатора.

Я пытался:

string activationUrl = sql.Substring(sql.IndexOf("http", sql.IndexOf(" ")));

Однако это не не похоже на работу. Может кто-нибудь объяснить, где я иду не так, пожалуйста? Спасибо.

Ответы [ 5 ]

1 голос
/ 21 января 2020

В вашей попытке 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;
}
1 голос
/ 21 января 2020

URL-адреса могут содержать много символов, но они не могут содержать пробелы, поэтому вы можете добиться большего успеха, используя регулярные выражения.

Простой шаблон сказал бы: «Начинается с http, за которым следует более 1 непробельного символа»

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

Пример в реальном времени: https://rextester.com/BOV71354

0 голосов
/ 21 января 2020
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

0 голосов
/ 21 января 2020

Я не совсем уверен, что вы имеете в виду под просто URL. Код, который вы используете, идет от первого экземпляра «http» во всем тексте, а затем идет к первому индексу «» в строке. Первый экземпляр «http» находится в третьей строке, первый экземпляр «» находится в первой строке сразу после слова «Thank».

Если 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"

0 голосов
/ 21 января 2020

это решение предполагает, что будет только один URL

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

https://dotnetfiddle.net/tnUTPk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...