2012-03-25 14 views
1

Ich habe diese SaiteRegex Matching definierte Tags in C#

This is a <143>sample</143> regex <143>pa<665>t</665>tern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175> 

und ich soll nur das Spiel erhalten, indem Tags. Ich benutze es zur Hervorhebung von Text.

Erwarteter Ausgang:

<143>sample</143> 
<143>pa<665>t</665>tern</143> 
<665>t</665> 
<143>by</143> 
<128>c#</128> 
<132>name</132> 
<175>Vincent</175> 

Ich habe versucht, dieses RegexMuster:

<(143|128|132|175)>.*</(143|128|132|175)> 

aber es wird alles das Ergebnis als Spiel zu drucken, die gesamte Zeichenfolge.

Hilfe bitte.


Follow-up-Frage

statt die ganze Linie von Spiel bekommen, kann ich den Text innerhalb des Tags allein bekommen? wie bekomme ich nur Probe statt < 143> Probe < `/ 143>

+2

Erlauben Sie verschachtelte Tags? –

+0

ah ja ich vergaß .. es ist verschachtelte Tags –

+2

In diesem Fall: http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-in sich abgeschlossene-tags/1732454 # 1732454 –

Antwort

5

Diese beiden Änderungen sollen Ihnen helfen:

  • Verwenden non-greedy Matching (.*?).
  • Verwenden Sie eine backreference (\1), so dass Sie nur die gleichen Start- und End-Tag übereinstimmen.

Try this:

<(143|128|132|175)>.*?</\1> 

In Bezug auf "ah ja ich vergaß .. es ist verschachtelte Tags": dann ist es wahrscheinlich nicht klug, reguläre Ausdrücke zu verwenden. Verschachtelte Tags sind keine reguläre Sprache.

+0

einfügen Die Rückreferenz ist eine nette Geste, aber nicht wirklich benötigt. – barsju

+0

.. es sei denn, es ist geschachtelte Tags. In diesem Fall wird es nützlich sein. :) – barsju

+0

+1 aber braucht mehr emph. auf den letzten 2 Sätzen. Eine Menge mehr. –

0

Es ist, weil die * gierig ..

können Sie entweder machen es nicht gierige durch eine Zugabe.? .*?

oder

Sie können es alles machen passen, aber die ‚> ‚: [^<]*

ich in der Regel für die letzte gehen denn es ist leichter zu merken und funktioniert in den meisten Fällen ..

1

Wie schon gesagt, sollten Sie hier das faule Matching verwenden. Dies wird erreicht, indem ? an Ihren Quantifizierer angehängt wird. In Ihrem Fall ist es *.

Weiter, um Ihre Arbeit zu vereinfachen, könnten Sie das genannte Capture verwenden. Es wird vollständig in .NET unterstützt. Hier ist ein Beispielcode

var target = @"This is a <143>sample</143> regex <143>pattern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175>"; 
var pattern = new Regex("<(143|128|132|175)>(?<Content>.*?)</\\1>", RegexOptions.IgnoreCase); 
var result = pattern.Matches(target); 
for (var j = 0; j < result.Count; j++) { 
    var capts = result[j].Groups["Content"].Captures; 
    for (var i = 0; i < capts.Count; i++) { 
     Console.WriteLine(capts[i].Value); 
    } 
}