谁帮我解释下一个正则的代码

.Net技术 码拜 10年前 (2015-05-10) 621次浏览 0个评论
 
Regex reg = new Regex(@"(?is)(?<=<ul[^>]*?id=""newslist""[^>]*?>(?:(?!</?ul).)*)<a[^>]*?href=([""""\s]?)(?<href>[^""""\s]+)\1[^>]*?>(?<text>.*?)</a>");

(?:(?!</?ul).)*)什么意思?

正则头好大

这还真不知道,求解
字符描述:   \:将下一个字符标记为特殊字符或字面值。例如 “n “与字符 “n “匹 

配。 “\n “与换行符匹配。序列 “\ “与 “\ “匹配, “\( “与 “( “匹配。   

^   :匹配输入的开始位置。   

$   :匹配输入的结尾。   

*   :匹配前一个字符零次或几次。例如, “zo* “可以匹配 “z “、 “zoo “。   

+   :匹配前一个字符一次或多次。例如, “zo+ “可以匹配 “zoo “,但不匹配 “z “。   

?   :匹配前一个字符零次或一次。例如, “a?ve? “可以匹配 “never “中的 “ve “。   

.:匹配换行符以外的任何字符。   

(pattern)   与模式匹配并记住匹配。匹配的子字符串可以从作为结果的   Matches   集合中使用   Item   [0]…[n]取得。如果要匹配括号字符(和   ),可使用 “\( ”   

或   “\) “。   

x|y:匹配   x   或   y。例如   “z|food ”   可匹配   “z ”   或   “food “。 “(z|f)ood ”   匹 

配   “zoo ”   或   “food “。   

{n}:n   为非负的整数。匹配恰好n次。例如, “o{2} ”   不能与   “Bob   中的   “o ”   匹 

配,但是可以?quot;foooood “中的前两个o匹配。   

{n,}   :n   为非负的整数。匹配至少n次。例如, “o{2,} “不匹配 “Bob “中的 “o “,但是匹配 “foooood “中所有的o。 “o{1,} “等价于 “o+ “。 “o{0,} “等价于 “o* “。   

{n,m}   :m   和   n   为非负的整数。匹配至少   n   次,至多   m   次。例如, “o{1,3} ”   匹配   “fooooood “中前三个o。 “o{0,1} “等价于 “o? “。   

[xyz]   :一个字符集。与括号中字符的其中之一匹配。例如, “[abc] ”   匹 

配 “plain “中的 “a “。   

[^xyz]   :一个否定的字符集。匹配不在此括号中的任何字符。例如, “[^abc] ”   可以匹配 “plain “中的 “p “.   

[a-z]   :表示某个范围内的字符。与指定区间内的任何字符匹配。例如, “[a-z] “匹配 “a “与 “z “之间的任何一个小写字母字符。   

[^m-z]   :否定的字符区间。与不在指定区间内的字符匹配。例如, “[m-z] “与不 

在 “m “到 “z “之间的任何字符匹配。   

\b   :与单词的边界匹配,即单词与空格之间的位置。例如, “er\b ”   与 “never “中的 “er “匹配,但是不匹配 “verb “中的 “er “。   

\B   :与非单词边界匹配。 “ea*r\B “与 “never   early “中的 “ear “匹配。   

\d   :与一个数字字符匹配。等价于[0-9]。   

\D   :与非数字的字符匹配。等价于[^0-9]。   

\f   :与分页符匹配。   

\n   :与换行符字符匹配。   

\r   :与回车字符匹配。   

\s   :与任何白字符匹配,包括空格、制表符、分页符等。等价于 “[   

\f\n\r\t\v] “。   

\S   :与任何非空白的字符匹配。等价于 “[^   \f\n\r\t\v] “。   

\t   :与制表符匹配。   

\v   :与垂直制表符匹配。   

\w   :与任何单词字符匹配,包括下划线。等价于 “[A-Za-z0-9_] “。   

\W   :与任何非单词字符匹配。等价于 “[^A-Za-z0-9_] “。   

\num   :匹配   num个,其中   num   为一个正整数。引用回到记住的匹配。例如, “(.)\1 “匹配两个连续的相同的字符。   

\n:匹配   n,其中n   是一个八进制换码值。八进制换码值必须是   1,   2   或   3   个数字长。   

例如, “\11 ”   和   “\011 ”   都与一个制表符匹配。 “\0011 “等价于 “\001 ”   与   “1 “。八进制换码值不得超过   256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。   

\xn:匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如, “\x41 “匹配 “A “。 “\x041 “等价于 “\x04 ”   和   “1 “。允许在正则表达式中使用   ASCII   码。   

  

好了,常用的方法和属性就是这些了,上面的语法介绍的已经很详细了,我们就没有必要在罗嗦了,接下来我们来看看在具体的例子里面如何使用这些方法和属性来校验数据的合法性,我们还是举个例子吧,比如,我们想要对用户输入的电子邮件进行校验,那么,什么样的数据才算是一个合法的电子邮件呢?我可以这样输入:   

uestc95@263.net,当然我也会这样输入:xxx@yyy.com.cn,但是这样的输入就是非法的:xxx@@com.cn或者@xxx.com.cn,等等,所以我们得出一个合法的电子邮件地址至少应当满足以下几个条件:

1.   必须包含一个并且只有一个符号“@”   

2.   必须包含至少一个至多三个符号“.”   

3.   第一个字符不得是“@”或者“.”   

4.   不允许出现“@.”或者.@   

5.   结尾不得是字符“@”或者“.”   

  

所以根据以上的原则和上面表中的语法,我们很容易的就可以得到需要的模板如 

下: “(\w)+[@]{1}(\w)+[.]{1,3}(\w)+ ”   

  

接下来我们仔细分析一下这个模板,首先“\w”表示邮件的开始字符只能是包含下划线的单词字符,这样,满足了第三个条件;“[@]{1}”表示在电子邮件中应当匹配并且只能匹配一次字符“@”,满足了条件一;同样的“[.]{1,3}”表示在电子邮件中至少匹配1个至多匹配3个字符“.”   ,满足了第二个条件;模板最后的“(\w)+” 

表示结尾的字符只能是包含下划线在内的单词字符,满足了条件五;模板中间的 

“(\w)+”满足了条件四。   

  

然后,我们就直接调用刚才的那个函数CheckExp( “(\w)+[@]{1}(\w)+[.]{1} 

(\w)+ “,待校验的字符串)就好了,如果返回True就表示数据是合法的,否则就是不正确的,怎么样,简单吧。我们还可以写出来校验身份证号码的模板: “([0-9]) 

{15} “;校验URL的模板: “^http://{1}((\w)+[.]){1,3} “等等;我们可以看到,这些模板为我们提供了很好的可重利用的模块,利用自己或者别人提供的各种模板,我们就可以方便快捷的进行数据的合法性校验了,相信你一定会写出非常通用的模板的。   

20分
这个正则看着好眼熟
(?:(?!</?ul).)*)
(?!</?ul):匹配不是</?ul
(?:exp):匹配exp的内容,但不捕获组
总的就是匹配不是</?ul的其他任意数,且不捕获到组里
引用 3 楼 huangwenquan123 的回复:

这个正则看着好眼熟
(?:(?!</?ul).)*)
(?!</?ul):匹配不是</?ul
(?:exp):匹配exp的内容,但不捕获组
总的就是匹配不是</?ul的其他任意数,且不捕获到组里

后面的那个.是什么意思?

.:匹配除换行符以外的任意字符
当使用(?s)会改变.的匹配状态
(?is)(?<=<ul[^>]*?id=””newslist””[^>]*?>(?:(?!</?ul).)*)<a[^>]*?href=([“”””\s]?)(?<href>[^””””\s]+)\1[^>]*?>(?<text>.*?)</a>”

http://www.oicto.com/html/regex.htm
看这里.


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明谁帮我解释下一个正则的代码
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!