一、正则表达式
1、正则表达式(regex),用来描述一个匹配字符串集合的模式;
2、Unicode编码中汉字的范围:\ u2E80- \ u9FFF;
3、常用的正则表达式
(1)、(pattern):指定字符模式,例如:JAVA匹配的java;
(2)、(?:pattern):同上,只不过性能上有了优化;
(3)、(?!pattern):若字符串符合模式则将其过滤掉,在分析日志的时候,要过滤掉所有info,则可以写作 "^(?!.*.info)..*$";
(4)、\num:表示位置,例如:“([\\d])\\1{1}([az])\\2{1}”,匹配22ee这样的字符串,\\1指的是第一个括号内的内容;
(5)、. :任意单个字符,例如:Java匹配 j..a;
(6)、(ab | cd):ab或者cd,例如:"java".matches("j(ava|ave)"),结果为真;
(7)、[abc]:a,b或c,例如: “java”.matches("j[abc]va"),结果为true;
(8)、[^ abc]:除了a,b或c外的任意字符, “java”.matches(“j [^ abc] va”),结果为false;
(9)、[a-z]:a到z的任意字符,包括a和z,例如: “java”.matches(“j [az] va”),结果为true;
(10)、[^ a-z]:除了a-z的任意字符,例如: “java”.matches(“j [^ a-z] va”),结果为false;
(11)、[a-e [m-p]]:a-e或者m-p, 例如 : “java”.matches(“j [a-e [m-p]] va”),结果为true;
(12)、[a-e && [e-z]:ae与ez的交集,例如:“java”.matches(“j [ae && [ez]] va”),结果为false;
(13)、\b:匹配一个单词边界,例如:“welcome”.replaceAll(“me \\ b”,“o”),输出结果为welcoo;
(14)、\B:匹配一个非单词边界,例如:“welcomea”.replaceAll(“me \\ B”,“o”),输出结果为welcooa;
(15)、\d:0-9的一个数,例如:“java2”.matches(“java [\\ d]”),结果为true;
(16)、\D:一位非数字,例如:“java2”.matches(“java [\\ D]”),结果为false;
(17)、\w:匹配字母,数字,下划线,例如:“java _”.matches(“java [\\ w]”),结果为true;
(18)、\W:除字母,数字,下划线以外的任意字符, 例如:“java哈”.matches(“java [\\ W]”),结果为true;
(19)、\s:空白字符,例如:“java 2”.matches(“java [\\ s] 2”),结果为true;
(20)、\S:非空白字符,例如:“java2”.matches(“java [\\ S]”),结果为true;
(21)、\f:匹配一个换页符;
(22)、\n:匹配一个换行符;
(23)、\r:匹配一个回车符;
(24)、\t:匹配一个制表符;
(25)、\v:匹配一个垂直制表符;
(26)、\un:匹配n,n是一个用四个十六进制数字表示的Unicode字符,例如:\ u00A9匹配版权符号©;
(27)、p *:模式p出现0次或者多次,例如:“javaj”.matches(“java * j”),结果为true;
(28)、p +:模式p出现至少一次或者多次,例如:“javajavaj”.matches(“(java)+ j”),结果为true;
(29)、p ?:模式p重复0次或者1次,例如:“javaj”.matches(“(java)?j”),结果为true;
(30)、{n}:重复n次,例如:“aaa”.匹配(“a {3}”),结果为true;
(31)、{n,m}:重复n或者m 次, “aaa”.匹配(“a {3,4}”),结果为true;
(32)、{n,}:至少重复n次, “aaaaaa”.匹配(“a {3,}”),结果为true;
4、'(' 和 ')' 在正则表达式中是特殊符号,必须用“\\”进行转义,写为“\\(”和“\\)”,例如:
“(911)010-2345”。匹配(“\\([1-9] [\\ d] {2} \\)[\\ d] {3} - [\\ d] {4}”) ,结果为真;
5、正则表达式中不能包含任何空白符,否则将会报错;
6、A.和和A *意义是不同的,A.*是的意思是匹配以'A'开头的任意长度的字符串,A *的意思是匹配任意长度的由字符'A'组成的字符串;
7、\w等同于[A-Za-z0-9 _],\W等同于[^ A-Za-z0-9_];
8、可以使用()为模式分组,(ab){3}匹配ababab,ab {3}匹配abbb;
9、正则表达式也可以与字符串类中的的replaceAll,replaceFirst和split方法共用,例如:
System.out.println(“java java java”.replaceAll(“v\\w”,“wi”));
//结果为“jawi jawi jawi”;
System.out.println(“java java java”.replaceFirst(“v\\w”,“wi”));
//结果为“jawi java java”;
String [] split =“java2html2sql”.split(“\\d”);
//分割为“java”,“html”,“sql”;
10、split(regex,limit),limit参数确定模式匹配多少次,如果limit <= 0,那么和split(regex)等同,如果limit> 0,模式最多匹配limit-1次,例如:
String [] split =“java2html2sql”.split(“\\ d”,0);
//分割为“java”,“html”,“sql”;
String [] split =“java2html2sql”.split(“\\ d”,1)
//分割为“java2html2sql”;
String [] split =“java2html2sql”.split(“\\ d”,2)
//分割为“java”,“html2sql”;
String [] split =“java2html2sql”.split(“\\ d”,3)
//分割为“java”,“html”,“sql”;
11、默认所有的量词符都是贪婪的,这意味着它们会尽量的匹配可能的很多次,例如:
System.out.println(“jaaavaa”.replaceFirst(“a +”,“e”));
//结果为“jevaa”;
System.out.println(“jaaavaa”.replaceAll(“a +”,“e”));
//结果为“jeve”;
//可以在量词符后加,这意味着它们将匹配尽可能少的次数,例如?
System.out.println(“jaaavaa”.replaceFirst(“a +?”,“e”));
//结果为“jeaavaa”;