我正在使用正则表达式,大型 XML 文件的 C# 风格。我通过不止一个案例注意到,一些应该在一种“大字符串”上运行的模式根本不匹配。例如,以下字符串:
<p>
<?tex xxxxxx ?>
</p>
<table-wrap position="float">
<table>
<tbody>
<tr>
<td colspan="2">
<hr/>
</td>
</tr>
<tr>
<td>
<nlm.tabular>Patient</nlm.tabular>
</td>
<td>
<nlm.tabular>Patient Waiting Time</nlm.tabular>
</td>
</tr>
<tr><td
<nlm.tabular>1st patient in block <italic>B</italic>
<subscript>1</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular>0</nlm.tabular>
</td>
</tr><tr>
<td>
<nlm.tabular>2nd patient in block <italic>B</italic><subscript>1</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn></mml:mrow>
</mml:msubsup>
</mml:math></nlm.tabular>
</td>
</tr>
<tr>
<td>
<nlm.tabular>3rd patient in block <italic>B</italic>
<subscript>1</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
<mml:mrow><mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn></mml:mrow></mml:msubsup></mml:math>
</nlm.tabular>
<?tex llllll?>
</td></tr>
<tr>
<td>
<nlm.tabular/>
</td>
<td>
<nlm.tabular/>
</td>
</tr>
<tr>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:mo>⋮</mml:mo>
</mml:math>
</nlm.tabular>
</td>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:mo>⋮</mml:mo></mml:math>
</nlm.tabular>
<?tex cccccccc?>
</td></tr>
<tr>
<td>
<nlm.tabular>
<italic>n</italic>
<subscript>1</subscript>th patient in block <italic>B</italic>
<subscript>1</subscript></nlm.tabular>
</td><td>
<nlm.tabular>
<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow><mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
</mml:msubsup><mml:mo>+</mml:mo>
<mml:mo>…</mml:mo>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
<mml:mo>-</mml:mo>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</nlm.tabular>
</td>
</tr>
<tr>
<td colspan="2">
<hr/>
</td>
</tr>
<tr>
<td>
<nlm.tabular>vvvvvvvvvvvvvv</nlm.tabular>
</td>
<td>
<nlm.tabular>2222222222</nlm.tabular>
</td>
</tr>
<tr>
<td>
<nlm.tabular>Patient</nlm.tabular>
</td>
<td>
<nlm.tabular>Patient Waiting Time</nlm.tabular>
</td>
</tr>
<tr>
<td>
<nlm.tabular>1st patient in block <italic>B</italic>
<subscript>2</subscript>
</nlm.tabular>
</td>
<td>
<nlm.paragraph>0<?tex type="longcontinued-tabular" cols="xxx" width="yyy"?></nlm.paragraph>
</td>
</tr>
<tr>
<td>
<nlm.tabular>2nd patient in block <italic>B</italic>
<subscript>2</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</nlm.tabular></td>
</tr>
<tr>
<td>
<nlm.tabular>3rd patient in block<italic> B</italic>
<subscript>b</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi></mml:mrow><mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn></mml:mrow><mml:mrow>
<mml:mi>b</mml:mi></mml:mrow></mml:msubsup><mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</nlm.tabular>
</td>
</tr>
<tr>
<td rowspan="2">
<nlm.tabular>
<mml:math display="block">
<mml:mo>⋮</mml:mo>
</mml:math>
</nlm.tabular>
<nlm.tabular>
<italic>n</italic>
<subscript>b</subscript>th patient in block<italic> B</italic>
<subscript>b</subscript>
</nlm.tabular>
</td>
<td>
<nlm.tabular>
<mml:math display="block"><mml:mo>⋮</mml:mo>
</mml:math>
</nlm.tabular>
</td>
</tr>
<tr>
<td colspan="0">
<nlm.tabular/>
</td>
<td>
<nlm.tabular>
<mml:math display="block">
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn fontstyle="italic">2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>+</mml:mo>
<mml:mo>…</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo>+</mml:mo>
<mml:mi>S</mml:mi></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
<mml:mo>-</mml:mo>
<mml:mn fontstyle="italic">1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</nlm.tabular>
</td>
</tr>
<tr>
<td colspan="2"><hr/>
</td>
</tr>
</tbody>
</table>
</table-wrap>
我试图将它与:
MatchCollection mc = Regex.Matches(input , @"\<p\>\<\?tex\s*.*?\?\>\s*\<\/p\>\s*\<table\-wrap\s*.*?\>.*?\<\/table\-wrap\>);
简单地说,这根本没有任何匹配。如此大小的字符串也会发生同样的情况。
那么问题出在哪里呢?