正则表达式,组无需匹配

时间:2013-09-30 11:02:45

标签: regex html-parsing

像这样的正则表达式:

/<span[^>]*class=\"link[^>]*params=\"(\d+),(\d+),[^>]*>[^<]*from.*?(\d{1,2})(.*?)(\d{4}).*?(year|Year)[^<]*<\/span>/

这样的字符串:

<p id="p_195" class="s_16" style="text-indent:6pt;"><span class="link s_8" params="65537,21403229,0,195,0,0" onmouseover="this.style.textDecoration='underline';" onmouseout="this.style.textDecoration='none';" onclick="return onClickLink(event, this);">Sometext from 28&nbsp;september 2013& nbsp;year</span></p>

麻烦在于&nbsp;september &nbsp;。可以有一个空格或&nbsp;。我将regexp更改为:bla-bla-blah... from.*?(\d{1,2})**(& nbsp;|\s)**(.*?)(\d{4}).*?(year|Year) ...bla-bla-blah

(&amp; nbsp;没有空格)

所以,在比赛中我得到了(&nbsp;|\s)。但我不需要他们!如何在没有匹配的情况下对(&nbsp;|\s)进行分组?

1 个答案:

答案 0 :(得分:1)

你想要一个非捕获组,试试这个:

  

?(\ d {1,2})(?:&amp; nbsp; | \ s)(。?)(\ d {4})。*?(年|年)

有关详细信息,请参阅Kobi对OP的评论。 What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

小心使用非捕获组。如果您依赖组反向引用索引并突然决定将组更改为非捕获,则所有正则表达式都不支持它们,并且可能会破坏您的后处理代码。我的建议是始终在.Net中使用命名组。