if the string is as what you said, your pattern seems ok with the greedy matching if you add "</a>", for example Regex re = new Regex(@"<a href=[^<>]viewthread.php[^<>](?<link1>[^<>]*?)[^<>]>(?<title1>[^<>]*?)</a>.*<a href=[^<>]viewpro.php[^<>](?<link2>[^<>]*?)[^<>]>(?<title2>[^<>]*?)</a>", RegexOptions.IgnoreCase|RegexOptions.Singleline); or string s= "................"; Regex re = new Regex(@"<a\s+[^>]+>(?<title1>[^<]+)</a>.*<a\s+[^>]+>(?<title2>[^<]+)</a>", RegexOptions.IgnoreCase|RegexOptions.Singleline); Match m = re.Match(s); if (m.Success) { Console.WriteLine("text1:{0}", m.Groups["title1"].Value); Console.WriteLine("text2:{0}", m.Groups["title2"].Value); }
用RegexOptions.Singleline可以匹配一次,但是这个网页有几十条类似的重复,用什么方法可以全部捕获string stringRegex = @"<a href=[^<>]viewthread.php[^<>](?<link1>[^<>]*?)[^<>]>(?<title1>[^<>]*?)</a>.*<a href=[^<>]viewpro.php[^<>](?<link2>[^<>]*?)[^<>]>(?<title2>[^<>]*?)</a>"; Regex re = new Regex(stringRegex,RegexOptions.Singleline|RegexOptions.IgnoreCase ); string t1; string t2; ArrayList a1 = new ArrayList (); ArrayList a2 = new ArrayList (); foreach (Match m in re.Matches(t)) { t1 = m.Groups["link1"].ToString(); t2 = m.Groups["title1"].ToString();
if(String.IndexOf("nice")>-1)
{
...
}
else
{
...
}
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 (?=pattern)
正 向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 (?!pattern)
负 向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
( <img src="images/2003cn/multipage.gif" align="absmiddle" boader="0"> <a href="viewthread.php?tid=653126&page=1&extra=page%3D1">1</a> <a href="viewthread.php?tid=653126&page=2&extra=page%3D1">2</a> )</td></tr></table>
</td><td bgcolor="#F5F5FF" align="center">
<a href="viewpro.php?uid=210307">要获取的内容2</a>
<br><span class="smalltxt">2005-2-18</span></td>要获得的是:"要获取的内容1","要获取的内容2",中间的"
( <img src="images/2003cn/multipage.gif" align="absmiddle" boader="0"> <a href="viewthread.php?tid=653126&page=1&extra=page%3D1">1</a> <a href="viewthread.php?tid=653126&page=2&extra=page%3D1">2</a> )</td></tr></table>
</td><td bgcolor="#F5F5FF" align="center">"很难表达出来,我该怎么办来源,一张网页内容
string s_reg=@"^(?!nice)\w*$";
[^(nice)]但现在好像不能用。
string test="<a href="viewthread.php?tid=653126&extra=page%3D1&stock=trade" >要获取的内容1</a>
( <img src="images/2003cn/multipage.gif" align="absmiddle" boader="0"> <a href="viewthread.php?tid=653126&page=1&extra=page%3D1">1</a> <a href="viewthread.php?tid=653126&page=2&extra=page%3D1">2</a> )</td></tr></table>
</td><td bgcolor="#F5F5FF" align="center">
<a href="viewpro.php?uid=210307">要获取的内容2</a>
<br><span class="smalltxt">2005-2-18</span></td>"
中的"要获取的内容1"和"要获取的内容2"
之所以询问[^nice]的问题,是想实现类似
<a href=[^<>]viewthread.php[^<>](?<link1>[^<>]*?)[^<>] >(?<title1>[^<>]*?).*<a href=[^<>]viewpro.php[^<>](?<link2>[^<>]*?)[^<>]>(?<title2>[^<>]*?)的功能,当然以上的语法事实上实现不了,但能表达我的意思
其中:(?<title1>[^<>]*?).*
的.*希望把中间杂乱无章的内容去掉,另外为了不要过滤掉网页中其他条目,我试图让其不过滤某些特征,比如viewpro.php,所以就询问了如何匹配完整字符串的否
Regex re = new Regex(@"<a href=[^<>]viewthread.php[^<>](?<link1>[^<>]*?)[^<>]>(?<title1>[^<>]*?)</a>.*<a href=[^<>]viewpro.php[^<>](?<link2>[^<>]*?)[^<>]>(?<title2>[^<>]*?)</a>",
RegexOptions.IgnoreCase|RegexOptions.Singleline);
or
string s= "................"; Regex re = new Regex(@"<a\s+[^>]+>(?<title1>[^<]+)</a>.*<a\s+[^>]+>(?<title2>[^<]+)</a>",
RegexOptions.IgnoreCase|RegexOptions.Singleline); Match m = re.Match(s);
if (m.Success)
{
Console.WriteLine("text1:{0}", m.Groups["title1"].Value);
Console.WriteLine("text2:{0}", m.Groups["title2"].Value);
}
string t1;
string t2;
ArrayList a1 = new ArrayList ();
ArrayList a2 = new ArrayList (); foreach (Match m in re.Matches(t))
{
t1 = m.Groups["link1"].ToString();
t2 = m.Groups["title1"].ToString();
a1.Add(t1);
a2.Add(t2);
}
出现了大量的\n,用Singleline屏蔽\n是有效的,但为何只有一个匹配