正则表达式之基础(三)

获取匹配

上面提到的子模式可以分为两种情况 - Capturing(获取匹配)和Non-Capturing(非获取匹配)

获取匹配:匹配时会将所有子模式匹配结果存储起来,可供后面查找或者替换,比如后向引用。

非获取匹配:子模式的匹配结果不会被存储,更多是作为一种限制条件,比如正反向肯定预查,正反向否定预查。

后向引用

使用“\数字”表示前面第几个子模式的匹配结果

例:

Text:

<h1>This is a capturing example</h1>

<h2>This is a capturing example2</h3>

Test Regular Expression:

<(h\d)>.*?</\1>

Results:

<h1>This is a capturing example</h1>

<h2>This is a capturing example2</h3>

这里的“\1”就是对前面第一个子模式(h\d)匹配结果的引用,也就是引用“h1”

后向引用的应用场景通常是:

1.     匹配合法的html标记,就像上面的例子

2.     匹配重复的内容

非获取匹配

(?:pattern)

在子模式内部前面添加“?:”则表示该子模式是一个非获取匹配,也就意味着不可用于后向引用。只匹配,不保存。

Text:

Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

Test Regular Expression:

Windows (?:\w+\b)

Results:

Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

(?=pattern)

正向肯定预查。 在子模式内部前面添加“?=”,表示该子模式仅仅作为匹配的限制条件,并不会被当做匹配结果输出,更谈不上保存匹配结果。预查是不消耗字符的,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从 包含预查的字符之后开始。可以理解为以什么结尾。

Text:

Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

Test Regular Expression:

Windows (?=\d+\b)

Results:

Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

Windows Vista和Windows Xp中的windows因不满足限制条件而没有匹配到

(?!pattern)

正向否定预查。在子模式内部前面添加“?!”,同正向肯定预查,表示该子模式仅作为匹配的条件。在上面的例子中,只有Windows Vista和Windows Xp中的windows会被匹配到并输出结果。可以理解为不以什么结尾。

(?<=pattern)

反向肯定预查,和正向预查差不多,只是预查的方向不一样。可以理解为以什么开头。

Text:

95 Windows and 98 Windows are the successor.
Then 2000 Windows and Xp Windows appeared.

Vista Windows is the Latest version of the family.

Test Regular Expression:

(?=\d+\b) Windows

Results:

95 Windows and 98 Windows are the successor.
Then 2000 Windows and Xp Windows appeared.

Vista Windows is the Latest version of the family.

(?<!pattern) - 反向否定预查,和正向预查差不多,只是预查的方向不一样。在上面的例子中Xp Windows和Vista Windows中的Windows会被匹配并输出。可以理解为不以什么开头。

posted @ 2016-11-01 22:35  嘻哈烧饼  阅读(618)  评论(0编辑  收藏  举报