C# 将最接近的字符串与正则表达式匹配

C# 将最接近的字符串与正则表达式匹配,c#,regex,C#,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<

我有一个字符串:

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>
some text blah blah one some text blah blah two.
我想用模式选择
一些文本。*?两个

试试这个:

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

应该使用non-greedy来完成,但是我尝试在这里使用变量
\1
来重复组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);
空间评论摘要 区域/房间 评论 浴室 一些评论 空间摘要 空间 安装价格 浴室 $2,355.97


一些文本。“;
MatchCollection matches=Regex.matches(test,@“让我们关注一个非HTML问题:匹配两个分隔符之间最近的窗口。使用:

(?s)一些文本(?:(?!一些文本| 2)。*2
|||||
|第二分隔符

对于HTML解析,使用它将使维护代码的每个人的生活更加轻松


匹配任何字符(包括换行符)和
(?:(?!一些文本|两个)时,
(?)
将打开点播模式*
标记将匹配任何不是
某些文本
两个
文字字符序列起始字符的字符。

为什么在此处使用正则表达式而不是
IndexOf()
或其他什么的可能重复项?@Thomas可以将正则表达式插入IndexOf()中吗?顺便说一句,我不需要知道字符串是否存在,只需要选择内容。不幸的是,它没有返回任何匹配项。好吧。但是要把我真正需要的内容放在上下文中-如何从字符串
中获取一些可能更多的文本布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉de>一些
文本
两个
。同样,右边可以是任何东西,因为我们对它不感兴趣:您是否检查了建议的解决方案?它正在选择所有文本。好的,我明白了,我在关闭窗口之前更新了它,对不起。最安全的方法是使用右边的令牌:。
(?s)some text(?:(?!some text|two).)*two
    |<-1st->||<----TG Token ------>||
                                    |2nd delimiter