2009-10-14 3 views
2

, так как я не очень хорошо знаком с регулярным выражением, возможно ли (независимо от того, трудно ли это сделать или нет) извлечь определенный текст между символами? например:Использование методов String вместо Regex

<meta name="description" content="THIS IS THE TEXT I WANT TO EXTRACT" /> 
+0

, например ??? – solairaja

+1

Я не верю, что это будет сложно, но для любых нетривиальных реализаций вы смотрите на достаточно большое количество кода для написания и поддержки. И это не так, что вы будете бить где-нибудь рядом с представлением Regex. – Gregory

+0

RegEx - одна из тех ужасно запутывающих вещей, которых не следует избегать просто из-за ее сложности.Это намного эффективнее любого стандартного строкового метода (в большинстве случаев), и, скорее всего, это лучший выбор, даже если он пугает ум. : -! –

ответ

2

Конечно, вы можете определить начало и конец нужной подстроки с помощью строковых методов, таких как IndexOf, а затем получить желаемый Substring! В вашем примере вы хотите найти (с IndexOf) «contents =», а затем первый следующий ", правильно? И как только у вас есть эти индексы в строке, Substring будет работать нормально. (Не размещение C# код, потому что я не совсем уверен, что именно это, что вы хотите, за IndexOf и подстроки ... -!)

Если да, то:

int first = str.IndexOf("contents=\""); 
int last = str.IndexOf("\"", first + 10); 
return str.Substring(first + 10, last - first - 10); 

должны более или меньше делать то, что вы хотите (извиняется снова, если в этих жестко закодированных 10 s есть один или два, они предназначены для поддержки длины первой подстроки, которую вы ищете, немного измените их вверх или вниз, пока вы не получите именно тот результат, который вы хотите! -), но это общая концепция. Найдите начало с одним аргументом IndexOf, найдите конец с двумя аргументами IndexOf, отрежьте желаемую деталь с помощью Substring ...!

+0

thats right, то, что я после, является текстом между обоими кавычками, как внутри тега контента, как это: content = "Мне нужен этот текст" –

+0

спасибо за код Alex, но его нигде рядом с ним он всегда извлекает первые 15 или так символы начала файла .. странно ??? –

+0

Что вы видите, когда вы добавляете операторы вывода, чтобы показать значение первого и последнего? –

0

Уверен, что вы можете сделать это без применения регулярных выражений. Допустим, вы хотите, чтобы получить текст между < и> ...

string GetTextBetween(string content) 
{ 
    int start = content.IndexOf("<"); 
    if(start == -1) return null; // Not found. 
    int end = content.IndexOf(">"); 
    if(end == -1) return null; // end not found 
    return content.SubString(start, end - start); 
} 
1

если вход: text1/text2/text3

The below regex will give the 2 in the group i.e, TEXT3 

^([^/]*/){2}([^/]*)/$ 


if you need the last text always, then use the below 

^.*/([^/]*)/$ 
+0

Я думаю, что OP ищет решение без регулярных выражений. –

5

Поскольку вы привести пример XML, просто использовать XML-анализатор :

string s = (string) XElement.Parse(xml).Attribute("content"); 

XML не является простой текстовый формат и Regex ISN 'действительно очень хорошо подходит; с помощью соответствующего инструмента, защитят вас от целого ряда зол ... например, следующий идентичен в XML:

<meta 
    name="description" 
    content= 
     'THIS IS THE TEXT I WANT TO EXTRACT' 
/> 

Это также означает, что при изменении требования, у вас есть простого твик чтобы сделать код, вместо того, чтобы пытаться разблокировать регулярное выражение и снова вернуть его обратно (что может быть сложно, если вы получаете доступ к нетривиальному узлу). В равной степени xpath может быть вариантом; поэтому в ваших данных xpath:

/meta/@content 

все, что вам нужно.

Если вы не получили .NET 3.5:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
string s = doc.DocumentElement.GetAttribute("content"); 
+0

Это действительно приятно. Спасибо за это! знак равно –