javascript 正则表达式-贪婪模式与懒惰模式

http://buzheng.org/blog/regex-possessive-quantifiers-reluctant-quantifiers/

前段时间对自己以前了解的正则表达式的基础知识做了一个总结,有了基础知识已经能够能应付大多数情况,像字符串匹配、正则替换、校验等;但是再使用的过程中你可能发现一个问题,就是当使用重复元字符匹配数量时,总是会尽可能长的去匹配,而有时这恰恰不是你想要的。看下面的例子:

<a href=”http://www.google.com”>谷歌</a><a href=”http://www.baidu.com”>百度</a>

你希望匹配出每个链接的html内容。如果你用 <a (.*)</a>会首先匹配到整个字符串,而不是你希望的<a href=”http://www.google.com”>谷歌</a>和<a href=”http://www.baidu.com”>百度</a>。

为什么会出现这种情况呢?这就是正则表达式的贪婪模式。当出现重复数量的时候,会尽可能的多匹配。上述的正则表达式中 . 表示任意字符,* 代表可以重复出现任意个,根据正则表达式的贪婪个性,不匹配到最后才怪呢。就像人一样,有贪婪就有懒惰,一个?就可以让正则立刻改变本性,这时的正则就表现懒惰模式的本性了。

修改后的正则表达式为:<a (.*?)</a>,这时就可以匹配出每个连接的html了。

测试用例为:

package org.buzheng.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
	public static void main(String[] args) throws Exception {
		String value = "<a href="http://www.google.com">谷歌</a><a href="http://www.baidu.com">百度</a>";

		System.out.println("贪婪模式:");
		Pattern pattern = Pattern.compile("<a (.*)</a>");
		Matcher matcher = pattern.matcher(value);
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		System.out.println("贪婪模式:");
		pattern = Pattern.compile("<a (.*?)</a>");
		matcher = pattern.matcher(value);
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}
	}
}

最后总结一下数量元字符懒惰模式的常用写法(其实就是多了一个?):

x*?0个或者任意个x, 最少匹配
x??0个或这1个x, 最少匹配
x+?至少1个x, 最少匹配
x{n,}?至少n个x, 最少匹配
x{n,m}?至少n个x,至多m个x, 最少匹配

转载于:https://www.cnblogs.com/anjey/archive/2012/08/16/2642325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值