日期:2014-05-18  浏览次数:21044 次

高分求C#正则表达式,如何排除指定字符串?
<td>     asdfTDtdasdf   <     td>     TDtdss     </TD>   asdTDtdfasd   </TD>

例如上句,要求必须满足如下3条:
1>     想要取处于 <td和 </td> 之间的内容;
2>     <td与 </td> 之间不能再包含 <td字样;
3>     <td与 </td> 之间也不能包含 <     td字样,有空格也一样视为是 <td;

本例的运行结果应为     TDtdss    
请高手指教如何写正则表达式,感谢!


------解决方案--------------------
也就是只取最内层的 <td> ... </td> 是吧,那么 <td> ... </td> 之间是否可能有其它 <...> 标签,也就是是否可能出现“ <”和“> ”这两个字符,如果不会,那么很容易,这样

string yourStr = .............;
string result = string.Empty;
Match m = Regex.Match(yourStr, @ "(? <= <\s*td[^> ]*> )[^ <> ]*(?= </td> ) ", RegexOptions.IgnoreCase);
if (m.Success)
result = m.Value;


如果有可能,那么你这个就相当麻烦了,平衡组实现起来有困难,如果确实是这样的,那我看看用状态机来实现吧
------解决方案--------------------
-_-#,是我把问题想复杂了,因为你只要最内层的 <td> ... </td> ,所以可以直接用正则来取,无论其中是否有其它 <...> 标签


string test = " <td> asdfTDtdasdf < td> TDt <p> fdsa </p> dfdafds <br /> sfdsaf < div> dfd </div> sas </TD> asdTDtdfasd </TD> ";
string result = string.Empty;
Match m = Regex.Match(test, @ "(? <= <\s*?td[^> ]*> )(([^ <> ]*(?: <(?!(?:\s*?td|/td> ))[^> ]*> )+?[^ <> ]*?)+|[^ <> ]*)(?= </td> ) ", RegexOptions.IgnoreCase);
if (m.Success)
result = m.Value;


让我倒塌的是,开始写了一个比上面简单的正则,在正则测试工具里通过,但是在.net的程序里就会导致程序崩溃,就是匹配不出来,无奈,只好降低效率,用上面的写法了
------解决方案--------------------
string[] slist = { " <td> asdfTDtdasdf < td> TDtdss </TD> asdTDtdfasd </TD> ",
" <td> asdfTDtdasdf < td> <div> TDtdss </div> </TD> asdTDtdfasd </TD> "
};
Regex re = new Regex(@ " <\s*td[^> ]*> ((?> <\s*td[^> ]*> (? <NESTEDTD> )| </td> (? <NESTEDTD2> )|.)*)(?(NESTEDTD)(?!))(?(NESTEDTD2)(?!)) </td> ",RegexOptions.IgnoreCase|RegexOptions.Singleline);
foreach(string s in slist)
{
Console.WriteLine( "{0}: ",s);

Match m = re.Match(s);
if (m.Success)
{
Console.WriteLine( "{0} ",m.Groups[1].Value);
}
else
{
Console.WriteLine( "no match ");
}
}