我想知道网站是否包含重复的特定文字。
我通过这个获得源代码:
public static string getSourceCode(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream());
string sourceCode = sr.ReadToEnd();
sr.Close();
resp.Close();
return sourceCode;
}
然后我正在检查第二组正则表达式
try
{
sourceCode = Worker.getSourceCode(url);
Regex r = new Regex("(" + textBox1.Text + ")");
var m = r.Match(sourceCode);
dataGridView1.Rows.Add(m.Groups[1].Value);
}
catch
{
}
它无法正常工作。例如,我的源代码包含:
exampleexampleexampleXYZ
exampleXYZ
example
exampleXYZ
我的功能说,只有2组XYZ
,而不是3。
另一个例子,它有:
exampleXYZ
example
example
example
现在只有m.Groups[1].Value
才能找到m.Groups[0].Value
。为什么呢?
答案 0 :(得分:2)
我可能误解了你的问题,但在我看来,你的问题是你猜错了Match.Groups
的含义。
请考虑以下事项:
var re = new Regex("[a-z]([0-9]+)");
var m = re.Match("a1b22c333");
m.Groups
中的内容是什么?你的理论 - 不,实际上,我的理论是你的理论就是这样:
{ "1", "22", "333" }
这不是m.Groups
中的内容。这就是m.Groups
:
{ "a1", "1" }
这是因为Regex.Match
仅匹配第一场比赛。它返回一个Match
对象,描述它在一次匹配中找到的内容。 Match.Groups
中的第一项是整个匹配,与捕获组无关。其余项目是捕获组匹配的内容。捕获组由未转义的括号中包含的正则表达式的子字符串定义。
上面的正则表达式中有一个捕获组:
([0-9]+)
第一场比赛是“a1”。第一个捕获组匹配未捕获字符集[a-z]
后面的数字序列。
如果您想同时进行所有比赛,请致电Regex.Matches
,然后返回MatchCollection
。
var re = new Regex("[a-z]([0-9]+)");
foreach (var m in re.Matches("a1b22c333")) {
Console.WriteLine("Match:");
Console.WriteLine(" full match: " + m.Groups[0].Value);
Console.WriteLine(" first captured group: " + m.Groups[1].Value);
}
而且你不需要在整个正则表达式周围放置parens;所有你得到的只是一个与整个比赛相同的捕捉组。没有坏处,但它没有添加任何东西。