日期:2014-05-20  浏览次数:20791 次

求一正则表达式。!!!!!
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;