IndexOf ведет себя не так, как ожидалось C# - PullRequest
1 голос
/ 21 июня 2020

У меня есть следующие три строки кода, где html является страницей html, сохраненной в виде строки.

int startIndex = html.IndexOf("<title>") + 8; // <title> plus a space equals 8 characters
int endIndex = html.IndexOf("</title>") - 18; // -18 is because of the input, there are 18 extra characters after the username.
result = new Tuple<string, bool>(html.Substring(startIndex, endIndex), false);

При вводе <title>Username012345678912141618</title> я ожидал бы на выходе Username. Однако код не может найти </title>. Я не уверен, что не так. Кто-нибудь знает, что могло вызвать такое поведение? Я протестировал его на трех разных веб-страницах (все с одного и того же сайта), содержание которых я изучил.

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

String.Substring с 2 параметрами имеет следующую сигнатуру - String.Substring(int startIndex, int length) со вторым параметром количество символов в подстроке . Итак, вам нужно сделать что-то вроде этого (с учетом вашего комментария):

int startIndex = html.IndexOf("<title>") + 8;
int endIndex = html.IndexOf("</title>")
var result = new Tuple<string, bool>(html.Substring(startIndex, endIndex - startIndex - 18), false);
0 голосов
/ 21 июня 2020

Я понимаю, что OP спрашивал о методе IndexOf, но вот решение, в котором используется другой подход - регулярные выражения, которые идеально подходят для «хирургического» извлечения данных из строк.

для извлечения «имени пользователя» из тега html требуется следующий шаблон:

var pattern = $@"<title>Username(.+)</title>";

Этот шаблон будет использоваться следующим образом:

var pattern = $@"<title>Username(.+)</title>";
var ms = Regex.Match(html, pattern, RegexOptions.IgnoreCase);
var userName = ms.Groups.Count > 0 ? ms.Groups[1].Value : string.Empty;

Одно из преимуществ Regex заключается в том, что вы можете использовать точный текст, который вы используете для поиска нужных вам данных. Не нужно возиться с добавлением или вычитанием «мест» из индекса.

Вам нужно будет добавить:

using System.Text.RegularExpressions;

к классу, который вы собираетесь реализовать Regex.

...