public static void main(String[] args) {
//简单认识
/**
p("aa".matches("..."));//一个点就是一个字符。默认情况下.*中的.只能匹配出\n以外的字符,如果遇到要匹配的字符串包含回车换行符(多行),则正则表达式遇到换行符后会停止,导致包含回车换行符的串不能正确匹配,解决的办法是:
1、使用Pattern和Matcher对象
设置Pattern模式为:Pattern.DOTALL
2、使用String.replaceAll()
正则表达式写法:
String reg = "(?s)'.*'";
p("12313".matches("\\d{5}"));//一个\\d就代表一个数字。
p("asdfasdf887sfa000asf".replaceAll("\\d","-"));
Pattern p = Pattern.compile("[0-9]{3}");
Matcher m = p.matcher("224998");//匹配之后,会存在一个Matcher中。
while(m.find()) {
System.out.println(m.group());
}
**/
// 初步认识. * + ?
/**
p("a".matches("."));
p("aa".matches("aa"));
p("aaaaaa".matches("a*"));//0或者1次及以上
p("aaa".matches("a+"));//至少出现1次
p("aa".matches("a?"));//1个或者0个。
p("".matches("a?"));//即a有可能不出现,或者出现1次。
p("92834".matches("\\d{3,}"));//至少出现3次,没有上限;
p("9888".matches("\\d{3,4}"));//至少出现3次数字,但是不能超过4个。
p("127.0.0.1".matches("[1-9]{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//ip地址
p("192".matches("[0-2][0-9][0-9]"));
**/
// 范围
/*
p("a".matches("[abc]"));
p("abc".matches("[^abc]"));//小尖号在[]前面的话,说明是开头的意思。如果是在字符前,那就是取反。
p("A".matches("[a-zA-Z0-9]"));
p("A".matches("[a-z]|[A-Z]"));//a-z或者A-Z都行。另一种写法是:[a-z[A-Z]]
p("R".matches("[a-z&&[RGB]]"));//a-z而且R\G\B三者之一;
*/
// 认识\s \w \d \
// \s 代表所有空格[ \t\n\x0B\f\r] 大写的\S代表\s的取反。其它的大写都同理。
// \w 代表单词字符[a-zA-Z0-9_]
// \d 代表数字 [0-9]
/*
p(" \t\n\r".matches("\\s{4}"));//四个空格符。(包含所有空格符)
p(" ".matches("\\S"));//非空格
p("8_9".matches("\\w{3}"));//3个字符
p("abcsf231313&^%$$".matches("[a-z]+\\d+[&^%$]+"));
p("\\".matches("\\\\"));
*/
// POSIX class预定义的字符串
// p("asdfsd".matches("\\p{Lower}*"));//代表[a-z]。还有其它的。比较方便,还有其它类型。
// 边界 。开头^和结尾$ \\b代表是单词的边界(即空格什么的、换行、特殊字符等等)
// p("hello".matches("^h[a-z]*o$"));
// 空格([\s&&[^\n]]指的是空格但不是换行符)、以\n换行符结尾。
// p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
/*
//find and lookingAt(find是找符合正则表达式的子串,只要找到一个子串,查找引擎就会把原串已经找到的子串去掉。而matches是整体匹配)
Pattern p = Pattern.compile("\\d{3,5}");
String s = "123-32311-2343-00";
Matcher m2 = p.matcher(s);
m2.matches();//逻辑是一个字符一个字符进行匹配,匹配到123-时,就已经发现不满足\\d{3,5}这个要求了,但是已经匹配过的字符已经没有了。
// 所以当m2.matches()后,已经只有32311-2343-00了。
m2.reset();//通过这个方法可以实现查找引擎回归原始状态;
m2.find(); // 先找第一个串;
p(m2.start()+"-" + m2.end());//打印起始位置和结束位置;
m2.find();// 再找第二个串;
m2.find();//再找第三个串。。。。。
m2.lookingAt();//意思是每次从字符串的开始位置的开始查找。
**/
//替换
Pattern replace = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//不区分大小写的意思。
String replaceStr = "lsdkfJava asfJAVA jAva bbb";
Matcher replaceMatcher = replace.matcher(replaceStr);
/*while(replaceMatcher.find()) {
p(replaceMatcher.group());
}*/
//p(replaceMatcher.replaceAll("C++"));
// 将字符串出现的偶数子串用大写替换。奇数用小写替换;利用replacement;
StringBuffer buf = new StringBuffer();
int i = 0 ;
while (replaceMatcher.find()) {
i++;
if(i % 2 == 0){
replaceMatcher.appendReplacement(buf, "JAVA");
}else {
replaceMatcher.appendReplacement(buf, "java");
}
}
replaceMatcher.appendTail(buf); //如果不加这个方法,只到最后一个Java,后面的bbb就会不见了。
p(buf.toString());
// 分组。分组是用小括号包括的。如果要看几组,就看有几个小括号即可。
// qulifiers限定语。比如有正则表达式:
// (.{3,10})? 先吃进去3个,判断是否符合正则表达式,如果符合,则退出。如果没有,则继续向后找,直到找到为止。
// (.{3,10})+ 先吃进去10个,判断是否符合正则表达式,如果符合,则退出。如果没有,则不再找,马上退出。
nonCupturing();
}
private static void nonCupturing() {
String regex = "(.{3})(?=a)";// 找3个字符,以a结尾的子串。上面有说,如果有小括号,那就是分组,
// 但是这里有一种特殊情况是小括号里以问号开头,则是一种特殊的形式。
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("33abb4");
while (m.find()) {
p(m.group());
}
}
private static void black() {
//向前引用:(//d//d)//1 其中//1表示找到2个数字,group1后面的数字要和group1一模一样。
// (//d(//d))//2 其中//2表示group2后面的数字要和group2一模一样。
// flags的简写 比如忽略大小写:(?i)(java)
}
private static void p(Object o) {
System.out.println(o);
}
理解正则表达式
最新推荐文章于 2019-03-14 10:33:39 发布