黑马程序员技术交流社区
标题:
疑惑了很久的一个问题?
[打印本页]
作者:
旭辉lin
时间:
2014-8-31 10:52
标题:
疑惑了很久的一个问题?
本帖最后由 旭辉lin 于 2014-8-31 14:28 编辑
先行断言 后发断言 负向零宽断言,具体怎么用,区别在那儿?
作者:
她只是过客
时间:
2014-8-31 11:28
网上一搜就有详细的解释,也有例子,去看看吧
作者:
jtshawn
时间:
2014-8-31 12:17
过路过路
作者:
旭辉lin
时间:
2014-8-31 14:27
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";
Pattern pattern = Pattern.compile("[a-z]*(?=ing)");//从右向左找,[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("-------------");
//后发断言
String str5="abcdefg abcd";
Pattern pattern1 = Pattern.compile("(?<=abc)[a-z]*");//去掉以abc开头的单词的abc
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+"#");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2