HamzaMcBob Ответов: 3

Я застрял на этом коде , я пытаюсь извлечь строку с текстовой строкой в C#


Поэтому я пытаюсь извлечь все слова между ними.
<title> а в строке и он выдает эту ошибку с этим кодом

string ImpureTitleText = "I was very <title> proud of my nickname throughout high school. but today I couldn’t be .any ¡ different to what my </title> nickname was. ";// insert text file here

int Tstart = LesserImputerText.IndexOf("<title>") + "<title>".Length;
int TEnd = LesserImputerText.IndexOf("</title>");


//
string  PureTitleText= LesserImputerText.Substring(Tstart, TEnd - Tstart);


и с этой последней строкой кода он выдает ошибку
Length cannot be less than zero.'

и я понятия не имею, как это исправить

кроме того, есть ли способ сравнить 2 большие суммы текста друг с другом, чтобы увидеть, есть ли в них одни и те же слова

Что я уже пробовал:

плачет, отдыхает, а потом снова плачет

phil.o

Вы должны отложить плачущую часть до того, как выполнили базовый сеанс отладки.

3 Ответов

Рейтинг:
2

Patrice T

Разумно ли это ?

// you are storing the sentence in a variable
string ImpureTitleText = "I was very <title> proud of my nickname throughout high school. but today I couldn’t be .any ¡ different to what my </title> nickname was. ";// insert text file here

// and you search the Keywords in another
int Tstart = LesserImputerText.IndexOf("<title>") + "<title>".Length;
int TEnd = LesserImputerText.IndexOf("</title>");
// checking if both keywords were found is a good idea too.


Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Patrice T

Анонимному Даун-избирателю: мне любопытно узнать, в чем причина Даун-голосования.
Что же не так в ответе ?

Рейтинг:
1

Benktesh Sharma

Вот еще одно решение, которое использует разделение строк на основе <title> и находит чистый заголовок между ними.

Идея заключается в том, что сначала мы проверяем, содержит ли строка элементы <title> и . Это может быть ослаблено, если это необходимо.

Мы добавляем прокладку к передней и задней части, чтобы обработать край корпуса. Если у нас есть и "название", и как начало и конец чистого названия, давайте добавим блокнот". " в начало и конец текста. Это необходимо для определения того, содержит ли текст только допустимый заголовок.

Затем мы разделили строку на три сегмента.

После того, как строка была разделена, мы можем удалить площадку. По замыслу, дополненный символ существует в первом и последнем индексе исходного текста. Удаление может не потребоваться, если текст является временной переменной и не нужен в дальнейшем.

Наконец, второй элемент массива содержит заголовок, который является чистым.

Мы можем уточнить логику для обработки случаев, когда отсутствует окончание if. В этом случае необходимо сделать определенное предположение.

//Define a separator
string[] separatingStrings = { "<title>", "</title>"};

string text = "I was very <title> proud of my nickname throughout high school. but today I couldn’t be .any ¡ different to what my </title> nickname was. ";// insert text file here;
System.Console.WriteLine($"Original text: '{text}'");

//check if the string contains "<title> and </title>"
var hasStart = text.Contains(separatingStrings[0]); 
var hasEnd = text.Contains(separatingStrings[1]);

if (hasStart && hasEnd) //if we have valid title
{
	//add pads
	text = "." + text+ ".";
	//now split the text into three segments, i.e., before <title>, between <title> and </title> and after <title>. The second element in the array will contain the valid title.
        //split the text
	string[] splitText = text.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries);
	
	//remove the pad
	text = text.Remove(text.Length -1,1).Remove(0,1);  
	
	
	System.Console.WriteLine($"{text.Length} substrings in text:");

	foreach (var split in splitText)
	{
		System.Console.WriteLine($"	{split}");
	}

	//We will always have title in the second
	System.Console.WriteLine($"Final Title: \n\t{splitText[1]}");
}


Рейтинг:
0

OriginalGriff

Самый простой способ-использовать регулярное выражение:

private static Regex regex = new Regex("(?<=\\<title\\>).*?(?=\\</title\\>)",
    RegexOptions.Singleline |
    RegexOptions.CultureInvariant |
    RegexOptions.Compiled);
...
    string ImpureTitleText = "I was very <title> proud of my nickname throughout high school. but today I couldn’t be .any ¡ different to what my </title> nickname was. ";
    Match m = regex.Match(ImpureTitleText);
    if (m.Success)
        {
        string inside = m.Value;
        ...
        }


Patrice T

Привет ОГ, я думаю, это регулярное выражение "(?<=\\<title\\gt;)(.*?)(?=\\)" Так будет лучше.

OriginalGriff

Только если вы не хотите ничего захватить. :смеяться:
Там нет "\" после "названия" - это "/" - и даже если вы это исправите, это оставит закрытие "меньше, чем" в результате.

Patrice T

Гррр, конец был убит при копировании/вставке:
"(?&ЛТ;=\\&ЛТ;название\\&ГТ;(.*?)(?=\\&ЛТ;/заголовок\\&ГТ;)"
в принципе, я просто добавил группу захвата

OriginalGriff

Такое случается!
Вам не нужно группировать текст в середине, так как вы используете группы соответствия "исключенный префикс" и "исключенный суффикс" - они не включены в выходной текст, поэтому добавление группы просто добавляет дополнительный слой косвенности, который вам строго не нужен.

HamzaMcBob

Итак, я понял , что в коде , который я показал выше, отсутствовала строка кода, которая была в оригинале, это было регулярное выражение, и этот код, казалось, испортил его, он выглядел так раньше



строка ImpureTitleText = "я очень гордился своим прозвищем на протяжении всей средней школы. но сегодня я не мог быть ... никаким другим, чем был мой ник.";// вставить текстовый файл здесь
строки LesserImputerText = регулярное выражение.Заменить(ImpureTitleText, @"(@[а-Яа-З0-9]+)|([^0-9А-Яа-я \т])|(\ш+:\/\/\Ы+)", " ").ToString(); //избавляется от значений, отличных от ASCII (from http://luisquintanilla.me/2018/01/18/real-time-sentiment-analysis-csharp/) но, похоже, ничего не делает, когда ставит не ASCII-символ, такой как перевернутый восклицательный знак.
русском языке не относится инт = ImpureTitleText.Метод indexOf ("в<название&ГТ;") + "&ЛТ;титул&ГТ;".Длина; //отсюда до //это регулярное выражение разбивает его
инт, как правило, = ImpureTitleText.Помощи indexOf("");
строки PureTitleText = ImpureTitleText.Подстрока(Русском Языке Не Относится, Как Правило, - Русском Языке Не Относится);