实在不行了,只有在求救了,请各位高手指教了。我想匹配一个字符串,内容为一个HTML INPUT或SELECT控件,要求是INPUT或SELECT控件,属性中必须包含title属性,同时不包含id和name属性如:<INPUT class=class1 title=TITLE1 value=TEST> 匹配<INPUT readonly title=TITLE1 value=TEST> 匹配<INPUT id='INPUT1' class=class1 title=TITLE1 dataSrc="" value=TEST> 不匹配<INPUT name="INPUT1" class=class1 title=TITLE1 dataSrc="" value=TEST> 不匹配<INPUT id=INPUT1 name=INPUT1 class=class1 title=TITLE1 value=TEST> 不匹配不用区分大小写.请问正则表达式应该怎么写??看了两天正则表达式了,还是搞不明白,唉!
http://www.netcsharp.cn/showtopic-470.aspx
谢谢你的回复,这篇文章我也看过了,这几天网上找了无数资料,不是没说到点子上就是我看不懂,呵呵。我用"(<INPUT|SELECT).*?"匹配标签开头可以,用"(?!NAME=)"来单独排除NAME属性也可以,但是连在一起用同时匹配不知为什么怎么也测试不通过
有一些基类就是用正则做的.
<(?=select|input)((?!id|name)[^>])*?(?:title)((?!id|name)[^>])*>
按楼主的意思,这个应该是匹配的修改了一下
(?i)<(?=select|input)((?!id|name)[^>])*?(?:title=(?<quote>["'\s])?.*?\<quote>?)((?!id|name)[^>])*>
重要的是,你的HTML要符合XML规范,属性值用双引号括起来
这样就行了。
MatchCollection mc = Regex.Matches(str, @"<(?:input|select)(?=[^>]*title=)(?![^>]*(?:id|name)=)[^>]*>", RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
richTextBox1.Text += m.Value + "\n";
}
@"<input(?![^>]*\s+(?:id|name)=)(?=[^>]*\s+title=)[^>]+>"
确实要考虑环境,否则这正则要写到完全通用不容易。比如说你input中会不会出现类似 **id,**name 的属性名呢?你的input中会不会出现value="id=2",value="name='a'"之类的呢?
这些都是问题。