求一正则表达式。!!!!!
GET /?=任意无空格字符 HTTP/1.1
我要首先检测是否符合上面的条件,如果符合提取出上面的“任意无空格字符”
我自己写了个:
Regex reg = new Regex(@ "^GET\s\S+\sHTTP/1.1 ",RegexOptions.IgnoreCase);
System.Text.RegularExpressions.MatchCollection Temp = reg.Matches(OldString, 0);
这样能根据匹配个数得到是否符合,但不太好提取出符合条件的“任意无空格字符”
求高手指点一二
------解决方案--------------------GET\s/\?=(? <Name> \S+)\sHTTP/1
(? <GroupName> ...),这个GroupName就是为组取的名字
------解决方案--------------------其实楼主用这个表达式会比较好
GET /\?=(? <Name> [^\s]*) HTTP/1.1
------解决方案--------------------or try...
for example:
string str = "GET /?=index.aspx HTTP/1.1 ";
string s = " ";
if (Regex.IsMatch(str, @ "^GET\s+/\?=\s*([\S]*)\s+HTTP/1.1$ "))
{
s = Regex.Match(str, @ "^GET\s+/\?=\s*([\S]*)\s+HTTP/1.1$ ").Groups[1].Value;
}
Console.WriteLine(s);
输出:
index.aspx
------解决方案--------------------捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
组零始终代表整个表达式。
之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。
这种捕获组我们可以通过Groups[1].Value等得到相应捕获组的匹配结果
(? <name> ...) 指定唯一有效的捕获是显式命名或编号的组,这是一种正则语法规则。
((? <name> A)(B(C)))这种捕获组中(? <name> A)为命名捕获组,我们可以不必去计算应该是Groups[i]中的i是几,而直接使用Groups[ "name "].Value得到匹配结果。
------解决方案--------------------Regex reg = new Regex(@ "(? <=^GET\s/\?=)\S+(?=\sHTTP/1) ",RegexOptions.IgnoreCase);
string Temp = reg.Match( "GET /?=任意无空格字符 HTTP/1.1 ").Value;