通过.net的正则
http://www.aa.bb.com
htp://aa.bb.com
aa.bb.com上面3个都得到 aa并对语句稍微讲解一下。谢谢。
(?<=http://)(\w+) 这个是我写的。不知道怎么加上或者匹配www
还有?<= 这个什么意思查不到。
http://www.aa.bb.com
htp://aa.bb.com
aa.bb.com上面3个都得到 aa并对语句稍微讲解一下。谢谢。
(?<=http://)(\w+) 这个是我写的。不知道怎么加上或者匹配www
还有?<= 这个什么意思查不到。
http://www.aa.bb.com
htp://aa.bb.com
aa.bb.com 上面3个都得到 aa
匹配www. 0次或多次的后面字符。但该字符。不包括 w
求更好答案。
是不是少了一个t:
http://aa.bb.com
这样是不是没有问题?
www.xxx.cn
会获得www
Regex re = new Regex(@"(?:http://)?(?:www)?\.?(?<a>\w+)..*", RegexOptions.Compiled);
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
请按任意键继续. . .
逆序肯定环视,表示所在位置左侧能够匹配Expression
Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase
string patten = @"^http://(www\.){0,1}.+\.(com|net|cn)$";
http://www.bb.cn获得的是bb。正确应该是空的。
www.xxx.cn
有啥区别?
www.aa.cn
是一级域名。
yyy.aa.cn
是二级域名
www这3个字母应该是不能作为二级域名的。
最后 一个是xxx。这种情况应该的得到空。我就可以知道用户进入的是主站。
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 匹配结果: 未匹配
应该有很多正则初学者。
@"(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+))");不是每个符号都能明白。请讲解。
先看下有没有不符合要求的吧
刚看了下,虽然对目前的结果没影响,不过上面的正则是少了一个“+”的
Match m = Regex.Match(s, @"(?i)(?<=^|http://(?:www\.)?)(?!www\.)\b\w+(?!\.\w+$)(?=(?:\.\w+)+)");解释的话会比较多,明天整理下再回吧,今天先睡了
用在这里就表示左侧必须是字符串开始位置^,或者以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+这样的规则,如果能保证传过来的参数符合域名规则,这个条件可以去掉关于环视,可以参考一下我的博客,目前只写了几篇,后续会陆续增加
正则基础之——环视
多谢lxcnn的详细回帖子。
(?!\.\w+$) 这个条件主要是用来限定右侧不能只有一个.com之类的域我,也就是要排除www.bb.com这种域名
这句话应该是排除类似于www.com这类的域名吧,而不是www.bb.com。
因为\.\w+$就是说只出现一次.就结束了啊!还望您指点。