2016-04-25 4 views
-1

У меня есть строка:точное совпадение ближе строка с регулярным выражением

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> 

Я хочу, чтобы выбрать с регулярным выражением таблицу, которая имеет комментарии <!--START SPACE SUMMARY> и <!--END SPACE SUMMARY-->.

Я пробовал с @"<table.*?><tbody.*?><!--START SPACE SUMMARY>.*?<!--END SPACE SUMMARY--></tbody></table>", но он выбирает обе таблицы в строке.

EDIT: Мой вопрос не обязательно должен делать именно с HTML. Тот же вопрос будет стоять, если у меня была строка:

some text blah blah one some text blah blah two. 

И я хочу, чтобы выбрать some text blah blah two с рисунком some text.*?two.

+0

Возможный дубликат [тегов открытого доступа для RegEx, кроме тегов с автономными XHTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-containedtt) –

+1

Зачем использовать Regex здесь, а не 'IndexOf()' или что-то еще? –

+0

@Thomas может быть введено в IndexOf()? Кстати, мне не нужно знать, существует ли строка, но для выбора содержимого. – kiriz

ответ

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); 

Идея заключается в том, чтобы использовать (?!.*<table) сказать Regex двигателя, то текст внутри не должен содержать другую таблицу якоря.

0

Попробуйте это:

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

Это должно быть сделано с не жадный, но я пытаюсь использовать переменную \1 здесь, чтобы повторить группы 1 значение. А также избежать / до \/. Возможно, это проблема.

+0

К сожалению, это не возвращает никакого соответствия. – kiriz

1

Давайте сосредоточимся на проблеме, отличной от HTML: сопоставим ближайшее окно между двумя разделителями. Используйте tempered greedy token:

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

regex demo См

Для HTML разбора используйте HtmlAgilityPack, это сделает жизнь проще для всех, кто собирается сохранить свой код.

(?s) включается режим DOTALL когда . соответствует любому символу, включая символ новой строки и (?:(?!some text|two).)* закаленной жадного знак будет соответствовать любому символу, не начиная характер some text или two буквенных последовательностей символов.

+0

Хорошо. Но поставить в контексте то, что мне действительно нужно - как получить «некоторые, может быть, больше текста« бла-бла-бла-бла-двое »из строки« еще какой-то текст, бла-бла, один, может быть, больше текста «бла-бла-два»? Использование слов 'some',' text' и 'two'. – kiriz

+0

То же самое, только правая сторона может быть чем угодно, поскольку нас это не интересует: https://regex101.com/r/pE1qG5/1 –

+0

Вы проверили предложенное решение? Он выбирает весь текст. – kiriz