Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]+)\"*[^>]*value=\"*(?<value>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "..."; MatchCollection mc = reg.Matchs(html); foreach(Match m in mc) { string name = m.Groups["name"].Value; string value = m.Groups["value"].Value; //... }
<input.+?name="(.+?)".+?value="(.+?)".+?>
MatchCollection mc = Regex.Matches(html,@"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>"); foreach(Match m in mc) { //m.Groups["name"].Value; //m.Groups["value"].Value; }
2,3楼的没考虑value和name位置交换后的情况。
给个错误例子 ^_^我测试没错 private static void TestRegex24() { string html = "<input name=\"aa\" value=\"bb\"> "; MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>"); foreach (Match m in mc) { Console.WriteLine(m.Groups["name"].Value); Console.WriteLine(m.Groups["value"].Value); } } 结果 aa bb
private static void TestRegex24() { string html = "<input value=\"bb\" name=\"aa\"> "; MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>"); foreach (Match m in mc) { Console.WriteLine(m.Groups["name"].Value); Console.WriteLine(m.Groups["value"].Value); } } 换一下name 和 value的顺序,还是 aa bb
确实忽略了一点。private static void TestRegex24() { //string html = "<input value=\"bb\" name=\"aa\"> "; string html = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">"; MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+>"); foreach (Match m in mc) { Console.WriteLine(m.Groups["name"].Value); Console.WriteLine(m.Groups["value"].Value); } }
3楼: 不要用'.',因为它不能表达你所期望的"任意字符",因为它不匹配换行符。而换行在html源码中是常见的,一个标签也常被换行分成两部分。4楼: 首先,vlaue在前而name在后恐怕在html中极少见吧?就算有,我认为你的式子也太复杂了些,还不如这样呢:Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]+)\"*[^>]*value=\"*(?<value>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);Regex reg2 = new Regex("<input[^>]+value=\"*(?<value>[^\\s\">]+)\"*[^>]*name=\"*(?<name>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "..."; MatchCollection mc = reg.Matchs(html); MatchCollection mc2 = reg2.Matchs(html); foreach(Match m in mc) { string name = m.Groups["name"].Value; string value = m.Groups["value"].Value; //... }foreach(Match m in mc2) { string name = m.Groups["name"].Value; string value = m.Groups["value"].Value; //... }貌似笨了些,但简单可靠。而且便于楼主理解。
我有点疑问 如果 name属性 不是用" ' 或是不用 那么上面的正则都还可以吗?
使用一段html进行匹配,怎么只有一个结果?
<input title="xxa" name = "sss" dgsd="xxx" value="dd">将此语句换成这个呢?
Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]*)\"*[^>]*value=\"*(?<value>[^\\s\">]*)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "..."; MatchCollection mc = reg.Matchs(html); foreach(Match m in mc) { string name = m.Groups["name"].Value; string value = m.Groups["value"].Value; //... }
显然可以,value捕获为空而已。 吧上面几个例子串起来private static void TestRegex24() { string html1 = "<input value=\"bb\" name=\"aa\"> "; string html2 = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">"; string html3 = "<input type=\"hidden\" name=\"source\" value=\"\" /> "; string html = html1 + html2 + html3; MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+?>"); foreach (Match m in mc) { Console.WriteLine("name is : " + m.Groups["name"].Value); Console.WriteLine("value is : " + m.Groups["value"].Value); } }结果 name is : aa value is : bb name is : sss value is : dd name is : source value is :
private static void TestRegex24() { //string html = "<input value=\"bb\" name=\"aa\"> "; string html = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">"; MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+>"); foreach (Match m in mc) { Console.WriteLine(m.Groups["name"].Value); Console.WriteLine(m.Groups["value"].Value); } }
用jquery吧 var arrinput=$("input[name='控件名称']");//得到所有指定类型的input类型集合 for循环取值
string str = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">fgdgs\r\ndsg<input type=\"hidden\" name=\"source\" value=\"ss\" />dgds\r\ndgsdg<input value=\"4444\" type=\"hidden\" name=\"ddd\" />"; System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"(?is)<input.*?(?:name=(['""]?)(?<name>\w+)\1|value=(['""]?)(?<value>\w+)\2|.)+?>", System.Text.RegularExpressions.RegexOptions.IgnoreCase); System.Text.RegularExpressions.MatchCollection m = reg.Matches(str); //设定要查找的字符串 for (int i = 0; i < m.Count; i++) { Response.Write(m[i].Groups["name"].ToString() +"_" +m[i].Groups["value"].ToString() + "<br>"); }
都把问题复杂化了 <input name="" value=""> 规则: <input\s+name="(?<NAME>.*?)"\S+value="(?<VALUE.*?>)">注:NAME和VALUE是数据库表中的字段名,对应的也就是获取的name 和 value 的值
up Regex reg = new Regex(@"<input\s+(?:.*?)name=""(.*?)""\S+(?:.*?)value=""(.*?)""(?:.*?)>",RegexOptions.IgnoreCase);string html = "..."; MatchCollection mc = reg.Matchs(html); foreach(Match m in mc) { string name = m.Groups[1].Value; string value = m.Groups[2].Value; //... }
MatchCollection mc = Regex.Matches(myhtml, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>"); name和value之间还有样式,怎么去除啊?
Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]+)\"*[^>]*value=\"*(?<value>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "...";
MatchCollection mc = reg.Matchs(html);
foreach(Match m in mc)
{
string name = m.Groups["name"].Value;
string value = m.Groups["value"].Value;
//...
}
foreach(Match m in mc)
{
//m.Groups["name"].Value;
//m.Groups["value"].Value;
}
给个错误例子 ^_^我测试没错
private static void TestRegex24()
{
string html = "<input name=\"aa\" value=\"bb\"> ";
MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>");
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
}
}
结果
aa
bb
将字符串换成这个?
private static void TestRegex24()
{
string html = "<input value=\"bb\" name=\"aa\"> ";
MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>");
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
}
}
换一下name 和 value的顺序,还是
aa
bb
确实忽略了一点。private static void TestRegex24()
{
//string html = "<input value=\"bb\" name=\"aa\"> ";
string html = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">";
MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+>");
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
}
}
不要用'.',因为它不能表达你所期望的"任意字符",因为它不匹配换行符。而换行在html源码中是常见的,一个标签也常被换行分成两部分。4楼:
首先,vlaue在前而name在后恐怕在html中极少见吧?就算有,我认为你的式子也太复杂了些,还不如这样呢:Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]+)\"*[^>]*value=\"*(?<value>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);Regex reg2 = new Regex("<input[^>]+value=\"*(?<value>[^\\s\">]+)\"*[^>]*name=\"*(?<name>[^\\s\">]+)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "...";
MatchCollection mc = reg.Matchs(html);
MatchCollection mc2 = reg2.Matchs(html);
foreach(Match m in mc)
{
string name = m.Groups["name"].Value;
string value = m.Groups["value"].Value;
//...
}foreach(Match m in mc2)
{
string name = m.Groups["name"].Value;
string value = m.Groups["value"].Value;
//...
}貌似笨了些,但简单可靠。而且便于楼主理解。
使用一段html进行匹配,怎么只有一个结果?
<input type="hidden" name="source" value="" /> 这样的获取不了
Regex reg = new Regex("<input[^>]+name=\"*(?<name>[^\\s\">]*)\"*[^>]*value=\"*(?<value>[^\\s\">]*)\"*[^>]*>", RegexOptions.IgnoreCase);string html = "...";
MatchCollection mc = reg.Matchs(html);
foreach(Match m in mc)
{
string name = m.Groups["name"].Value;
string value = m.Groups["value"].Value;
//...
}
(?is)<input.*?((name=\"(?<name>[^"]*)\" ).*?|(value=\"(?<value>[^"]*)\") .*?)\> 我这样子写的正则为什么只可以匹配value 而name 却不可以 捕获?
显然可以,value捕获为空而已。
吧上面几个例子串起来private static void TestRegex24()
{
string html1 = "<input value=\"bb\" name=\"aa\"> ";
string html2 = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">";
string html3 = "<input type=\"hidden\" name=\"source\" value=\"\" /> ";
string html = html1 + html2 + html3;
MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+?>");
foreach (Match m in mc)
{
Console.WriteLine("name is : " + m.Groups["name"].Value);
Console.WriteLine("value is : " + m.Groups["value"].Value);
}
}结果
name is : aa
value is : bb
name is : sss
value is : dd
name is : source
value is :
{
//string html = "<input value=\"bb\" name=\"aa\"> ";
string html = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">";
MatchCollection mc = Regex.Matches(html, @"(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| |.)+>");
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
}
}
var arrinput=$("input[name='控件名称']");//得到所有指定类型的input类型集合 for循环取值
(?is)<input.*?(?:name[^=]*=.*?(['""]?)(?<name>[^'"" ]*)\1|value[^=]*=.*?(['""]?)(?<value>[^'""]*?)\2| )+>
string str = "<input title=\"xxa\" name=\"sss\" value=\"dd\" dgsd=\"xxx\">fgdgs\r\ndsg<input type=\"hidden\" name=\"source\" value=\"ss\" />dgds\r\ndgsdg<input value=\"4444\" type=\"hidden\" name=\"ddd\" />";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"(?is)<input.*?(?:name=(['""]?)(?<name>\w+)\1|value=(['""]?)(?<value>\w+)\2|.)+?>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.MatchCollection m = reg.Matches(str); //设定要查找的字符串
for (int i = 0; i < m.Count; i++)
{
Response.Write(m[i].Groups["name"].ToString() +"_" +m[i].Groups["value"].ToString() + "<br>");
}
<input name="" value="">
规则:
<input\s+name="(?<NAME>.*?)"\S+value="(?<VALUE.*?>)">注:NAME和VALUE是数据库表中的字段名,对应的也就是获取的name 和 value 的值
Regex reg = new Regex(@"<input\s+(?:.*?)name=""(.*?)""\S+(?:.*?)value=""(.*?)""(?:.*?)>",RegexOptions.IgnoreCase);string html = "...";
MatchCollection mc = reg.Matchs(html);
foreach(Match m in mc)
{
string name = m.Groups[1].Value;
string value = m.Groups[2].Value;
//...
}
name和value之间还有样式,怎么去除啊?