java 零宽断言

本文详细介绍了Java中正则表达式的零宽断言,包括先行断言(?=exp)、后发断言(?<=exp)、负向零宽断言(?!exp)以及负向零宽后发断言(?<!exp),并提供了相关示例进行解释。

常用分组语法

分类

代码/语法

说明

捕获

(exp)

匹配exp,并捕获文本到自动命名的组里

(?<name>exp)

匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

(?:exp)

匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp后面的位置

(?!exp)

匹配后面跟的不是exp的位置

(?<!exp)

匹配前面不是exp的位置

注释

(?#comment)

这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

零宽断言又分四种:

先行断言   也叫零宽度正预测先行断言(?=exp)   --  表示匹配表达式前面的位置

例如 [a-z]*(?=ing) 可以匹配 cooking  singing 中的 cook  sing

 

后发断言   也叫零宽度正回顾后发断言(?<=exp)  --  表示匹配表达式后面的位置 

例如(?<=abc).* 可以匹配 abcdefg 中的 defg

 

负向零宽断言 

负向零宽断言 (?!exp) 也是匹配一个零宽度的位置,不过这个位置的“断言”取表达式的反值,例如 (?!exp) 表示 "exp" 前面的位置,如果 "exp" 不成立 ,匹配这个位置;如果 "exp" 成立,则不匹配。同样,负向零宽断言也有“先行”和“后发”两种,负向零宽后发断言为 (?<!exp) 

 

负向零宽后发断言(?<!exp) 

负向零宽先行断言 (?!exp) 

 

负向零宽断言要注意的跟正向的一样。 

 

 

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

public class Regex {

	public static void main(String[] args) {

		//先行断言 //去掉以ing结尾的单词的ing
		String str4="cooking singing ing ing";
		//从右向左找,[a-z]*代表匹配范围,?=ing代表匹配条件
		Pattern pattern = Pattern.compile("[a-z]*(?=ing)");
		Matcher matcher = pattern.matcher(str4);
		//matcher.find();
		while(matcher.find()){//总共找了6次
			String aa = matcher.group();
			System.out.println(aa+"#");
		}//找到了匹配条件就置为空字符串,然后在原来的位置再找,捕获符合条件的表达式,
		//没有符合的表达式,就在下一个范围找
		//找到了ing,然后ing置为空,接着还是在原来的位置找,找到了sing,
		//同理在cooking中找,找到了ing置为空字符串,接着还是在原来的位置找,找到了cook
		
/*结果:		cook#
			#
			sing#
			#
			#
			#
*/
		System.out.println("-------------");
		//后发断言 //去掉以abc开头的单词的abc
		String str5="abcdefg abcd";
		Pattern pattern1 = Pattern.compile("(?<=abc)[a-z]*");
		Matcher matcher1 = pattern1.matcher(str5);
		while(matcher1.find()){
			String aa = matcher1.group();
			System.out.print("#"+aa);
		}
		
		System.out.println();
		System.out.println("-------------");
		
		
		//负向零宽后发断言(?<!表达式) 后写条件
		//负向零宽先行断言 (?!表达式) 先写条件后写范围

		//负向零宽断言要注意的跟正向的一样 (即条件在前还是在后)
		String str6="52305668";
		Pattern pattern2 = Pattern.compile("^(\\d(?<!7))+$");//数中不能包含7

		//Pattern pattern2 = Pattern.compile("^\\d{7}(?!8)\\d$");
		//排除尾号是8的数 (?!8)代表匹配条件 后面的\\d代表范围

		//Pattern pattern2 = Pattern.compile("^\\d(?<!1)\\d{7}$");
		//排除头是1的数 前面的\\d代表范围  (?<!1)代表匹配条件

		Matcher matcher2 = pattern2.matcher(str6);
		//System.out.println(matcher2.matches());
		while(matcher2.find()){
			String aa = matcher2.group();
			System.out.print(aa+"#");
		}
	}

}


 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值