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

C#正则表达式如何排除一个模式?
例如:

<a   href= "test1.htm "> <span   class= "style16 "> Wireless </span> (美国5) </a> <br>
<a   href= "test2.htm "> <span   class= "style16 "> Sega </span> (美国6) </a>

以上例子中,想要实现以下:
第一个问题(5个要求)
1>   所取字符必须处于在 <a   href与 </a> 之间
2>   所取字符必须处于> 和 <之间,若有多个需连在一起一并显示
3>   传入条件为html地址,如传入test1.htm条件
4>   </a> 有可能是 <     /   a> ,即中间有空格需视为 </a> 处理
5>   <a       href中的 <与a之间可以有多个空格视为 <a,但a与href之间的多个空格视为一个空格
综上所述,传入test1.htm,得到的值应为   Wireless(美国5)

第二个问题:
如何写正则表达式实现以下要求:
在 <a   href与 </a> 之间如何排除包含有 <a/> 这个字符串,即使 <a   /     > 也是不可以,烦请单独列一正则表达式给我查看;

以上为2个问题,高分回馈!
如何实现?请帮我.

------解决方案--------------------
up
------解决方案--------------------
第一个问题,src为源字符串,con为传入条件

private string GetLinkText(string src, string con)
{
string result = string.Empty;
Match m = Regex.Match(src, @ " <\s*a\s*href= " " " + con + @ " " "[^> ]*> (? <content> [\s\S]*? <\s*/\s*a\s*> ) ", RegexOptions.IgnoreCase);
if (m.Success)
{
result = Regex.Replace(m.Groups[ "content "].Value, @ " <[^> ]*> ", " ");
}
return result;
}

其实这类问题用正则来处理有一定的局限性,因为有些字符在正则中是有特殊意义的,在正则中加入变量,如果含有这些特殊字符,就有可能导致异常,所以如果可能含有如下这些字符的时候,需要做下预处理
$ ^ { [ ( | ) * + ? \
就是把如上字符前加上转义字符“\”,以使其在正则中是当做普通字符来匹配的
而根据实际情况,需转义的字符,可能不止上面这些的
------解决方案--------------------
第二个问题,按你的例子,有两个符合条件的结果,你是要一个,还是要多个

这是取第一个的
string yourStr = .............;
string result = string.Empty;
Match m = Regex.Match(yourStr, @ " <\s*a\s[^> ]*> ((?> <\s*a\s[^> ]*> (? <NESTEDTD> )| <\s*/\s*a\s*> (? <NESTEDTD2> )|.)*)(?(NESTEDTD)(?!))(?(NESTEDTD2)(?!)) <\s*/\s*a\s*> ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
if (m.Success)
result = m.Value;


这是取多个的
string yourStr = .............;
MatchCollection mc = Regex.Matches(yourStr, @ " <\s*a\s[^> ]*> ((?> <\s*a\s[^> ]*> (? <NESTEDTD> )| <\s*/\s*a\s*> (? <NESTEDTD2> )|.)*)(?(NESTEDTD)(?!))(?(NESTEDTD2)(?!)) <\s*/\s*a\s*> ", RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n ";
}


这类问题还是用思归写的这种平衡组处理起来优雅些^o^
------解决方案--------------------
呵呵,倒也没什么,没有什么特殊事,我一般都在的,有问题给我发站内信(旧版)就行了

说下这个原理,用到的是平衡组

<\s*a\s[^> ]*> ((?> <\s*a\s[^> ]*> (? <NESTEDTD> )| <\s*/\s*a\s*> (? <NESTEDTD2> )|.)*)(?(NESTEDTD)(?!))(?(NESTEDTD2)(?!)) <\s*/\s*a\s*>

(? <group> Exp) 把捕获的内容命名为group,并压入堆栈
(? <-group> Exp) 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!) 负向预搜索,由于没有后缀表达式,试图匹配总是失败

这里用到了平衡组,得并不是平衡组的典型应用,因为没有用到(? <-group> ),平衡组的典型应用是这样的,每遇到一个(? <group> Exp)中Exp匹配的内容,就压入堆栈,每遇到一个(? <-group> Exp)中Exp匹配的内容,就弹出最后压入堆栈的group组捕获的内容,到最后用(?(group)(?!))检查堆栈是否为空,为空则说明是配对匹配的,否则就什么都不匹配

比如这是一个平衡组的典型应用
string yourStr = ...........;
string result = string.Empty;
Match m = Regex.Match(yourStr, @ " <[^ <> ]*(((? 'NES