2008-12-09 3 views
2

Мне нужен Regular Expressions, чтобы получить текст в течение 2 тегов.RegEx для получения текста по тегам

Скажем, мне нужен массив, содержащий любой текст в пределах <data> и </data> теги. или любой текст в тегах "(" и ")".

Как я могу это сделать с помощью RegEx в C#?


Передовой вопрос будет:

  1. Строка вход "цвет = RGB (50,20,30)"
  2. Как я могу получить 3 номера в 3 отдельно массивы, возвращаемые процессором RegEx в C#?
+0

Похож на «Регулярное выражение: вытащить раздел подстановки из строки между двумя тегами» - http://stackoverflow.com/questions/1237/regex-to-pull-out-a-section-a- substing-from-a-string-between-two-tags – 2008-12-09 16:55:23

ответ

3

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

private static readonly Regex RgbValuePattern = new Regex(@"(?<r>\d{1,3}) ?, ?(?<g>\d{1,3}) ?, ?(?<b>\d{1,3})", 
                  RegexOptions.Compiled | RegexOptions.ExplicitCapture); 

Тогда позже ...

var match = RgbValuePattern.Match(value); 

if (match.Success) 
{ 
    int r = Int32.Parse(match.Groups["r"].Value, NumberFormatInfo.InvariantInfo); 
    int g = Int32.Parse(match.Groups["g"].Value, NumberFormatInfo.InvariantInfo); 
    int b = Int32.Parse(match.Groups["b"].Value, NumberFormatInfo.InvariantInfo); 
    return Color.FromArgb(r, g, b); 
} 
4

Perl регулярное выражение будет

$string =~ /color=rgb\((\d+),(\d+),(\d+)\)/; 
@array = ($1,$2,$3); 

Но вы, вероятно, нужно больше информации, что это.

+0

Спасибо! Я попробую. – 2008-12-09 16:29:13

0

Я считаю, что реальные проблемы возникнут, когда вы захотите проанализировать конструкции вложенности. Например, если вы хотите изучить XML как это <data><data>123</data><data>456</data></data> для извлечения данных, включенных в самые внешние <data> тегов, одного только одного RegEx будет недостаточно. Просто предупредите, чтобы вы не использовали RegEx, где существуют еще несколько (мощных и специфических) методов. Реальные парсеры XML следует учитывать при выполнении более сложных задач в XML. Мои 2 цента ...

+0

Да, регулярные выражения известны тем, что не имеют рекурсивных данных. На самом деле она теоретически неспособна. – Arkadiy 2008-12-09 16:41:45

+0

Да, вы правы. Вы можете сопоставить конечную рекурсию (например, 3 и не более вложенные теги), но не можете решить проблему для произвольного уровня рекурсии. Конечный автомат просто не может отслеживать бесконечное количество шагов, необходимых для достижения уровня рекурсии. – IgorK 2008-12-10 11:51:18

+0

Недавно была найдена интересная функция регулярного выражения с регулярным выражением .NET (см. Http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx). Таким образом, с такой функцией вы фактически * можете * сопоставлять скобки. Было немного неожиданно для меня ... – IgorK 2010-01-23 17:56:19

1

Использование Regex для синтаксического анализа XML, как правило, очень плохая идея. См. this answer.

Смежные вопросы