2016-04-25 18 views
-1

Ich habe eine Zeichenfolge:Spiel exakt am nächsten Zeichenfolge mit Regex

Test. 
<div> 
<table style="color:blue;"><tbody><!--START SPACE COMMENTS SUMMARY--> 
<tr><td colspan="2">SPACE COMMENTS SUMMARY</td></tr> 
<tr><td style="min-width:200px;">Area/Room</td> 
<td style="max-width:300px;text-align:left;">Comments</td> 
</tr><tr><td style="min-width:200px;">Bathroom</td> 
<td style="max-width:300px;text-align:left;">Some comment</td></tr> 
<!--END SPACE COMMENTS SUMMARY--></tbody></table> 
<div> 
<table style="color:blue;"><tbody><!--START SPACE SUMMARY--> 
<tr><td colspan="2">SPACE SUMMARY</td></tr><tr> 
<td style="min-width:200px;">Space</td> 
<td style="max-width:300px;text-align:right;">Installed Price</td></tr> 
<tr><td style="min-width:200px;">Bathroom</td> 
<td style="max-width:300px;text-align:right;">$2,355.97</td></tr> 
<!--END SPACE SUMMARY--></tbody></table> 
<br><br><br><div>Some text.</div></div></div> 

ich mit regex auswählen möchten eine Tabelle, die Kommentare <!--START SPACE SUMMARY> und <!--END SPACE SUMMARY--> hat.

Ich versuchte mit @"<table.*?><tbody.*?><!--START SPACE SUMMARY>.*?<!--END SPACE SUMMARY--></tbody></table>", aber es wählt beide Tabellen in der Zeichenfolge.

EDIT: Meine Frage muss nicht genau mit HTML zu tun haben. Die gleiche Frage stehen wird, wenn ich einen String hatte:

some text blah blah one some text blah blah two. 

Und ich will some text.*?twosome text blah blah two mit einem Muster wählen.

+0

Mögliches Duplikat von [RegEx-Übereinstimmungs-Öffnungs-Tags außer XHTML-eigenen Tags] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

+1

Warum hier einen Regex verwenden und nicht 'IndexOf()' oder so? –

+0

@Thomas kann Regex in IndexOf() eingefügt werden? Übrigens muss ich nicht wissen, ob die Zeichenfolge existiert, sondern den Inhalt auswählen. – kiriz

Antwort

1
string test = @"Test. 
    <div> 
    <table style=""color:blue;""><tbody><!--START SPACE COMMENTS SUMMARY--> 
    <tr><td colspan=""2"">SPACE COMMENTS SUMMARY</td></tr> 
    <tr><td style=""min-width:200px;"">Area/Room</td> 
    <td style=""max-width:300px;text-align:left;"">Comments</td> 
    </tr><tr><td style=""min-width:200px;"">Bathroom</td> 
    <td style=""max-width:300px;text-align:left;"">Some comment</td></tr> 
    <!--END SPACE COMMENTS SUMMARY--></tbody></table> 
    <div> 
    <table style=""color:blue;""><tbody><!--START SPACE SUMMARY--> 
    <tr><td colspan=""2"">SPACE SUMMARY</td></tr><tr> 
    <td style=""min-width:200px;"">Space</td> 
    <td style=""max-width:300px;text-align:right;"">Installed Price</td></tr> 
    <tr><td style=""min-width:200px;"">Bathroom</td> 
    <td style=""max-width:300px;text-align:right;"">$2,355.97</td></tr> 
    <!--END SPACE SUMMARY--></tbody></table> 
    <br><br><br><div>Some text.</div></div></div>"; 

MatchCollection matches = Regex.Matches(test, @"<table(?!.*<table).*?<!--START SPACE SUMMARY-->.*?<!--END SPACE SUMMARY-->.*?table>", RegexOptions.Singleline); 

Die Idee ist (?!.*<table) zu verwenden Regex-Engine zu sagen, das der Text innerhalb sollte nicht eine andere Tabelle Anker enthalten.

0

Versuchen Sie folgendes:

<table.*?><tbody.*?><!--START (SPACE SUMMARY)>.*?<!--END \1--><\/tbody><\/table> 

Es sollte mit nicht-gierigen getan werden, aber ich versuche, variable \1 hier zu verwenden Gruppe 1 Wert zu wiederholen. Und auch die / zu \/ entkommen. Vielleicht ist das die Problemquelle.

+0

Leider gibt es keine Übereinstimmung zurück. – kiriz

1

Konzentrieren wir uns auf ein Nicht-HTML-Problem, das Sie haben: Passen Sie das nächste Fenster zwischen zwei Trennzeichen an. Verwenden Sie ein tempered greedy token:

(?s)some text(?:(?!some text|two).)*two 
    |<-1st->||<----TG Token ------>|| 
            |2nd delimiter 

Siehe regex demo

Für eine HTML-Analyse verwenden HtmlAgilityPack, wird es das Leben leichter machen für alle, die Ihren Code halten wird.

Die (?s) schaltet DOTALL Modus, wenn . jedes Zeichen übereinstimmt mit einer Neuen-Zeile und (?:(?!some text|two).)* temperierten gierige Token werden jedes Zeichen, das nicht das Anfangszeichen der some text oder two literal Zeichenfolge ist.

+0

In Ordnung. Aber um in Zusammenhang zu setzen, was ich wirklich brauche - wie man 'einige vielleicht mehr Text bla blah two' von der Schnur 'etwas mehr Text bla bla ein vielleicht mehr Text bla blah two 'bekommt? Verwenden der Wörter "einige", "Text" und "zwei". – kiriz

+0

Gleichermaßen kann nur die rechte Seite etwas sein, da wir nicht daran interessiert sind: https://regex101.com/r/pE1qG5/1 –

+0

Haben Sie die vorgeschlagene Lösung überprüft? Es wird der gesamte Text ausgewählt. – kiriz