关于如下正则表达式分析

Xsank 发布于 2013/03/31 21:07
阅读 210
收藏 0

@虫虫 你好,想跟你请教个问题:

首先,@红薯 曾说过 @虫虫 非常擅长正则(原话不是这样的),所以特此请教;其他看到此贴的朋友如能帮助,学生同样非常感谢!题目如下:

(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)(?::((?:\\\\.|[^\\\\>]+)+)?)?)?>)

上面就是这个正则了,从左往右分析大体是匹配一个<test1_:test2: ...... >这样的东东(后面就凌乱了)

在这里有三个问题:

1.那个红色背景的?是干嘛用的?怎么看着和非贪婪没有关系?不用应该也可以吧

2.那个黄色背景的部分就凌乱了,不知道到底是想做什么,和两个\\有什么关系

3.关于这种分组怎么下手好呢?


加载中
0
ErosVshare
ErosVshare

这里不知道\是否是以原意来解释的,我这里就用\原意来给你分析吧。


红色的“?”代表{0,1},代表前面的字符组或字符0个或1个。

后面(?::([a-zA-Z_]*))可以简化为(:([a-zA-Z_]*))匹配0个或多个字母加下划线如:

:aaaaa

现在加上前面,可以匹配的字符串如:<a:cc 或者<abb:cc或<a:或<abb:或<:cc或<:

现在分析后面,(?::((?:\\\\.|[^\\\\>]+)+)?)?)?>),将他简化为(:((\\\\.|[^\\\\>]+)+)?)?)?>)

\\\\.未被转义前是\\. ,含义是匹配一个\和除\n的任意字符,|符号后未转义前是:[^\\>],匹配非\和>的其他字符

后面就是量词了,没啥好说的。

总的来说,后面匹配的是:

1. 什么都没有

2. :

3. :\d

4. :\d\d\d\d

5. :e

6. :eeeeeee

7. :\deee\deeee


最极端的,*和?都有匹配的就是:

1.<abbbbb:ccccc:\d\d\d\d>

2.<abbbbb:ccccc:eeeeeee>

3.<abbbbb:ccccc:\deee\d\deee>

注入此类的字符串。


ErosVshare
ErosVshare
对于转义来说是有三个过程,字符串-->字符串正则--->实意。根据语言不同转义有区别。找本书来看。
Xsank
Xsank
回复 @ErosVshare : \是转义,\\\\就是\\了,还有别的?
ErosVshare
ErosVshare
这里需要根据\是否原意来做判断。如果不了解相关内容请参考任意一本正则入门的转义章节。
Xsank
Xsank
非常感谢你的帮助,不过这里还有两个疑问想你请教下: 1.\\\\.表示的是\\.吧,之后还会转义?如果要匹配\和任意字符,直接用\\.不就行了吗? 2.[^\\\\>]表示的是[^\\>],如果要是表示匹配非(\和>)的其他字符,直接用[^\\>]不可以吗?
0
h
harpmaster
单字符量词
* 等价于 {0,}
+ 等价于 {1,}
? 等价于 {0,1}  
是说有0个或1个前面的模式
Xsank
Xsank
回复 @harpmaster : 这两个是不一样,但是就这个地方而言,你能举出一个?和*匹配结果不同的例子吗?
h
harpmaster
不一样啊。。一个是只能是0次或一次,*是0次或多次
Xsank
Xsank
意思是这样的,不过由于前面字符的限定,只要这个串足够长,加?还是会匹配的,就这里而言用*是一样的吧
返回顶部
顶部