求一正则表达式

lsfv00011 2009-07-12 05:19:23
通过.net的正则
http://www.aa.bb.com
htp://aa.bb.com
aa.bb.com

上面3个都得到 aa

并对语句稍微讲解一下。谢谢。
(?<=http://)(\w+) 这个是我写的。不知道怎么加上或者匹配www
还有?<= 这个什么意思查不到。

...全文
353 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxlovw0813 2012-07-09
  • 打赏
  • 举报
回复
我怎么感觉有一个地方写错了呢?
(?!\.\w+$) 这个条件主要是用来限定右侧不能只有一个.com之类的域我,也就是要排除www.bb.com这种域名
这句话应该是排除类似于www.com这类的域名吧,而不是www.bb.com。
因为\.\w+$就是说只出现一次.就结束了啊!还望您指点。

[Quote=引用 26 楼 的回复:]
C# code
(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+)+)


(?i) 匹配模式,表示忽略大小写,在.NET中等价于在后面加RegexOptions.IgnoreCase参数

(?<=^|http://(?:www\.)?) 肯定逆序环视,语法(?<=Exp),最终匹配到的只是一个位置,相当于在……
[/Quote]
十八道胡同 2009-07-13
  • 打赏
  • 举报
回复
顶,好贴
lsfv00011 2009-07-13
  • 打赏
  • 举报
回复
非常感谢。暂不结帖.加分.顶.让初学者看看。
多谢lxcnn的详细回帖子。
-过客- 2009-07-13
  • 打赏
  • 举报
回复
(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+)+)


(?i) 匹配模式,表示忽略大小写,在.NET中等价于在后面加RegexOptions.IgnoreCase参数

(?<=^|http://(?:www\.)?) 肯定逆序环视,语法(?<=Exp),最终匹配到的只是一个位置,相当于在所在位置的左侧附加了一个条件,表示所在位置左侧必须能够匹配Exp
用在这里就表示左侧必须是字符串开始位置^,或者以http://(?:www\.)?开头,其中www.可有可无

(?!www\.) 否定顺序环视,语法(?!Exp),同上,匹配的只是一个位置,相当于在所在位置的右侧附加一个条件,表示所在位置右侧必须不能匹配Exp
用在这里是因为前面的www.是可有可无的,如果不加这个条件限定,那么最后一个例子
http://www.bb.com
将会匹配到www
在正则表达式尝试匹配到http://后的位置时,条件(?<=^|http://(?:www\.)?)中www.是可有可无的,所以也是满足的,这样后面的\b\w+就会匹配到www.,所以要加(?!www\.)这样一个条件,使这个位置的右侧不能是www.

\b\w+ \b单词边界,\w相当于[a-zA-Z0-9_]
\b限定取到的内容是开始位置,或:,或.与.之间完整的内容,而不是部分子串
还是最后的那个例了
http://www.bb.com
前面(?<=^|http://(?:www\.)?)(?!www\.)的条件限定,使得http://w以前的位置都不符合条件,在第一个w后的位置是满足以上条件的,如果这里不用\b限制,则\w+就可以匹配到ww,这个结果显然是错误的
域名的通用规则是a-zA-Z0-9_组成,其实还有一个“-”,\w在.NET中如果没有加RegexOptions.ECMAScript参数,那么还可以匹配一些本地字符集,如中文,全角数字等,所以用在这里并不是很合适,可以把表达式中的\w替换为[a-zA-Z0-9_-]

(?!\.\w+$) 这个条件主要是用来限定右侧不能只有一个.com之类的域我,也就是要排除www.bb.com这种域名

(?=(?:\.\w+)+) 这个条件主要是用来限定右侧要符合多个.\w+这样的规则,如果能保证传过来的参数符合域名规则,这个条件可以去掉

关于环视,可以参考一下我的博客,目前只写了几篇,后续会陆续增加
正则基础之——环视
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
ok。我等。
-过客- 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lsfv00011 的回复:]
请解释下吧。
应该有很多正则初学者。
@"(?i)(? <=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+))");

不是每个符号都能明白。请讲解。
[/Quote]

先看下有没有不符合要求的吧
刚看了下,虽然对目前的结果没影响,不过上面的正则是少了一个“+”的
Match m = Regex.Match(s, @"(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+)+)");


解释的话会比较多,明天整理下再回吧,今天先睡了
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
请解释下吧。
应该有很多正则初学者。
@"(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+))");

不是每个符号都能明白。请讲解。
-过客- 2009-07-12
  • 打赏
  • 举报
回复
try...

string[] test = new string[] { "http://www.aa.bb.com", "http://aa.bb.com", "aa.bb.com", "http://www.bb.cn" };
foreach (string s in test)
{
Match m = Regex.Match(s, @"(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+))");
if (m.Success)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "匹配结果: " + m.Value + "\n";
}
else
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "匹配结果: 未匹配\n";
}
}
//输出
源字符串: http://www.aa.bb.com 匹配结果: aa
源字符串: http://aa.bb.com 匹配结果: aa
源字符串: aa.bb.com 匹配结果: aa
源字符串: http://www.bb.cn 匹配结果: 未匹配
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lcl_data 的回复:]
C# codestring s1=@"http://www.aa.bb.com";string s2=@"http://aa.bb.com";string s3=@"aa.bb.com";string s4=@"www.xxx.cn";
Regex re=new Regex(@"(?:http://)?(?:www)?\.?(?<a>\w+)..*", RegexOptions.Compiled);if (re.Match(s1).Success&& re.Match(s2).Success&& re.Match(s3).Success&& re.Match(s4).Success)
{
Console.WriteLine(re.Match(s1).Groups["a"].Value);
Console.WriteLine(re.Match(s2).Groups["a"].Value);
Console.WriteLine(re.Match(s3).Groups["a"].Value);
Console.WriteLine(re.Match(s4).Groups["a"].Value);
}


aa
aa
aa
xxx
请按任意键继续. . .
[/Quote]

最后 一个是xxx。这种情况应该的得到空。我就可以知道用户进入的是主站。
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
区别很大。
www.aa.cn
是一级域名。
yyy.aa.cn
是二级域名
www这3个字母应该是不能作为二级域名的。
十八道胡同 2009-07-12
  • 打赏
  • 举报
回复
http://www.bb.cn
www.xxx.cn
有啥区别?
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lcl_data 的回复:]
C# codestring s1=@"http://www.aa.bb.com";string s2=@"http://aa.bb.com";string s3=@"aa.bb.com";string s4=@"www.xxx.cn";
Regex re=new Regex(@"(?:http://)?(?:www)?\.?(?<a>\w+)..*", RegexOptions.Compiled);if (re.Match(s1).Success&& re.Match(s2).Success&& re.Match(s3).Success&& re.Match(s4).Success)
{
Console.WriteLine(re.Match(s1).Groups["a"].Value);
Console.WriteLine(re.Match(s2).Groups["a"].Value);
Console.WriteLine(re.Match(s3).Groups["a"].Value);
Console.WriteLine(re.Match(s4).Groups["a"].Value);
}


aa
aa
aa
xxx
请按任意键继续. . .
[/Quote]

http://www.bb.cn

获得的是bb。正确应该是空的。
wuyq11 2009-07-12
  • 打赏
  • 举报
回复
(?<=Expression)
逆序肯定环视,表示所在位置左侧能够匹配Expression
Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase
string patten = @"^http://(www\.){0,1}.+\.(com|net|cn)$";
lixiankun001 2009-07-12
  • 打赏
  • 举报
回复
都是牛人。。。。 学习了!
十八道胡同 2009-07-12
  • 打赏
  • 举报
回复
string s1 = @"http://www.aa.bb.com";
string s2 = @"http://aa.bb.com";
string s3 = @"aa.bb.com";
string s4 = @"www.xxx.cn";
Regex re = new Regex(@"(?:http://)?(?:www)?\.?(?<a>\w+)..*", RegexOptions.Compiled);
if (re.Match(s1).Success && re.Match(s2).Success && re.Match(s3).Success && re.Match(s4).Success)
{
Console.WriteLine(re.Match(s1).Groups["a"].Value);
Console.WriteLine(re.Match(s2).Groups["a"].Value);
Console.WriteLine(re.Match(s3).Groups["a"].Value);
Console.WriteLine(re.Match(s4).Groups["a"].Value);
}



aa
aa
aa
xxx
请按任意键继续. . .
十八道胡同 2009-07-12
  • 打赏
  • 举报
回复
ok...
 Regex re = new Regex(@"(?:http://)?(?:www)?\.?(?<a>\w+)..*", RegexOptions.Compiled);
十八道胡同 2009-07-12
  • 打赏
  • 举报
回复
new Regex(@"(?:http://)?(?:www)?.?(?<a>\w+)\.\w+\.", RegexOptions.Compiled);
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
也不行啊。
www.xxx.cn
会获得www
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
new Regex(@"(?:http://)?(?:www\.)?(?<a>\w+)\.\w+\.", RegexOptions.Compiled);
这样是不是没有问题?
lsfv00011 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 typeof 的回复:]
C# code@"(?:http://)?(?:www\.)?(?<a>\w+)"// 捕获组 <a> 就是所求
[/Quote]
如果不是二级域名。会得到一级的。还是需要改下啊。
加载更多回复(9)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧