正则表达式
定义字符串的模式,字符串都能通过正则表达式表达出来,通过正则表达式“指定"筛选满足要求的字符串
基本语法
- 每个
()
中可以包括一个正则表达式,()
组成的字符串可以选择某个来进行匹配 - 转义字符
“\”
,在java正则中“\\”
表示“\”
,个数一定是偶数,比如匹配“\”
字符:声明String s = "\\";
对应的正则表达式String pattern = "\\\\"
。(第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身).;对于本身就是像“\n \r”
这样的,正则表达式也是一个“\n \r”
(就是一个整体),如果是匹配一些特殊字符,就是直接声明字符串时就要转义的字符,例如String s = "\["
,匹配这个括号的时候就需要正则表达式String pattern = "\\["
^
定义开始匹配的字符,这个和$
就是精准的匹配,标定了一串字符串的开始和结束,如果不使用,如果字符串中包含一段满足条件的就会匹配成功$
定义结束匹配的字符*
匹配前面的表达式0或多次;+
一次或多次;?
0或者1次.
匹配除"\r\n"之外的任何单个字符。要匹配包括"\r\n"在内的任意字符的话,用"[\s\S]"*、+、?、{n}、{n,}、{n,m}
后面加上“?”
表示非贪心,匹配最少{n}
n非负整数,匹配n个前面的表达式;{n,}
匹配至少n个;{n,m}
至少n至多m()
匹配括号内的表达式及其子表达式(?:自定义表达式)
匹配表达式但是不匹配它的子表达式?=自定义表达式)
正向预测,符合表达式的前者才会匹配?!自定义表达式)
和上面相反|
或,不能同时[各种字符]
匹配单个字符的,串中某一个字符在中括号里,这个字符就匹配成功了(比如匹配一个字符串有n个字符,就需要n个中括号)[^各种字符]
,不包含的,串中某一个字符不在这个范围就能;[a-z]
类似\b
匹配字边界,这个字符前面的表达式作为收尾\B
非边界的表达式\d
数字字符,就是[0-9]
\D
非字符,就是[^0-9]
\n
换行符\r
回车\s
任何空白字符\S
任何非空白字符\t
制表符\w
字类字符,就是[A-Za-z0-9_]
字母数字下划线\W
非字类字符
几个小例子(网上找的一些,自己练一练)
用String的matches(String s)检验
1.表示数值的字符串,比如字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是
String pattern = "[+-]?[0-9]*(\\.[0-9]+)?([eE][+-]?[0-9]+)?"
[+-]?
首位某个符号出现0或者1次
[0-9]*
0或者多次出现1位数字
(\\.[0-9]+)?
小数点只有一个,多位的数字,整体有一个或者没有
([eE][+-]?[0-9]+)?
两种指数符号取一即可,可有可无但是不能出现两次的正负号,指数值一定要有;最后这个指数结构可以没有
2.对输入的qq号进行匹配(qq匹配规则:长度为5-10位,纯数字组成,且不能以0开头)1
String pattern = "[1-9][0-9]{4,9}"
[1-9]
首位是除去0的一个数
[0-9]{4-9}
剩下的4到9位可以是0到9
3.非负整数,非正整数,负整数,整数,非负浮点数(默认都是以字符串形式写的)
^\\d+$
,^-\\d+|0$
,^[+-]?\\d+$
,^+?\\d?(\\.\\d+)?([eE][+-]?\\d+)?$
4.长度为8-10的用户密码(字母开头,数字和下划线)
^[a-zA-Z]\w{7,9}
5.电子邮箱
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
Java中处理正则表达式的函数
1.class Pattern
按照 jdk 源码中描述的:
“正则表达式,指定为字符串,首先一定要编译为 Pattern 类的一个实例,然后利用这个实例创建一个 Matcher使用”
基本使用:
String s = "I am PanicJaw";
Pattern pattern = Pattern.compile("^[A-Z](\s[a-zA-Z]+)+$");
Matcher matcher = pattern.matcher(s);
matcher.matches();//这个是匹配整个字符串,不全部匹配用find()