正则表达式-零宽度断言详解

零宽度断言是正则表达式中一种重要方法,它主要用于捕获指定内容之前或之后的字符串


(?:X):非捕获组

它用于捕获包含某一段特征内容X的字符串,但并不捕获特征内容X

比如有一字符串“ID=1234567”,仅想捕获ID的具体内容“1234567”,而不需要捕获字符串“ID=”,这里就可以用非捕获组(?:ID=)(\d+)

public static void main(String args []){
		Pattern p = Pattern.compile("(?:ID=)(\\d+)");  //编译正则表达式
		Matcher m = p.matcher("ID=1234567");
		if(m.find()) {
			System.out.println(m.group(1)); //获得分组1的内容即(\d+)所捕获的内容
			System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串,group(0)与group()等效
			System.out.println(m.group());  //获得与正则表达式整体匹配的字符串
		}
	}
运行结果:



(?=X):

用于捕获以特征内容X开头的字符串或者捕获特征内容X之前的字符串。

比如有一字符串"baidu.com",仅想捕获“baidu”,而不需要捕获".com",这里可以使用(\w+)(?=\.com)

public static void main(String args []){
		Pattern p = Pattern.compile("(\\w+)(?=\\.com)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //获得分组1的内容,即(\w+)所捕获内容
			System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串
			System.out.println(m.group());  //获得与正则表达式整体匹配的字符串
		}
	}
运行结果:

上面这种情况属于捕获特征内容X之前的字符串。

现在看另外一种情况,比如有现在有一字符串"www.baidu.com", (?=baidu)(.+)捕获的结果是什么呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(?=baidu)(.+)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //获得分组1的内容
			System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串
			System.out.println(m.group());  //获得与正则表达式整体匹配的字符串
		}
	}
运行结果:


可见捕获的是以baidu开头的字符,而且捕获了baidu。

总结一下:如果(?=X)放在左边例如 (?=baidu)(.+),是捕获以baidu开头的字符串。

如果(?=x)放在右边例如(\w+)(?=\.com),是捕获.com之前的字符串,并且不捕获.com


(?!X):

与(?=X)相反,!相当于“不等于”的意思。

如果(?!X)放在左边例如 (?!baidu)(.+),是捕获不以baidu开头的字符串。

如果(?!X)放在右边例如(\w+)(?!\.com),表明待捕获字符串后面不能是.com。


(?<=X):

捕获指定内容X之后的字符串或捕获以指定内容X结尾的字符串

还是以"www.baidu.com"为例,(?<=www\.)(.+)得到的结果是什么呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(?<=www\\.)(.+)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //获得分组1的内容
			System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串
			System.out.println(m.group());  //获得与正则表达式整体匹配的字符串
		}
	}

运行结果:


它捕获的的是指定内容之后的字符串。

(.+)(?<=\.com)又将得到什么结果呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(.+)(?<=\\.com)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //获得分组1的内容
			System.out.println(m.group(0)); //获得与正则表达式整体匹配的字符串
			System.out.println(m.group());  //获得与正则表达式整体匹配的字符串
		}
	}

运行结果:

它捕获的是以".com"为结尾的字符串。

总结一下:

如果(?<=X)放在左边例如 (?<=www\.)(.+),是捕获"www."后面的字符串,但不捕获"www."。

如果(?<=x)放在右边例如(.+)(?<=\.com),是捕获以".com"结尾的字符串。


(?<!X):

与(?<=X)相反,!相当于“不等于”的意思。

如果(?<!X)放在左边例如(?<!www\.)(.+),是待捕获的字符串前面不能是"www."。

如果(?<!X)放在右边例如(\w+)(?!\.com),表明待捕获的字符串不能以".com"结尾。

转载于:https://www.cnblogs.com/xiaogua918/p/4181583.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值