java 零宽断言
2014-08-31 15:08
141 查看
常用分组语法 | ||
分类 | 代码/语法 | 说明 |
捕获 | (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+"#"); } } }
相关文章推荐
- Java正则零宽断言
- Java正则零宽断言
- Java正则表达式 预搜索(零宽断言)详解(精)
- 6.Java中的异常、断言、日志【草稿中】
- Java断言assert的使用方法
- java 断言 assert 初步使用:断言开启、断言使用
- 转:JAVA断言使用
- 负向零宽断言
- 理解和正确使用Java中的断言(assert)
- 正则表达式中的零宽断言
- 负向零宽断言 备忘录
- 帮你调试-Java1.4-assertions,断言使你的代码更加稳定
- JAVA断言使用
- Java 中断言介绍
- Py正则表达式中的【零宽断言】
- 5.Java中的异常、断言、日志【草稿上】
- JAVA中断言的使用
- 正则表达式--负向零宽断言
- 7.Java中的异常、断言、日志【草稿下,Log4j专题】
- java关键字--assert(断言)