正则表达式
-
正则表达式 : 定义了字符串的匹配模式
-
可以用来搜索,编辑或处理文本,并不仅限于某一种语言,但是每种语言中有细微的差别
-
JDK1.4 推出的 java.util.regex 包,很好的支持了正则表达式
-
常用语法 :
-
\ 转移符 , 把有意义字符转换为无意义字符
-
但是java中 \ 也是转移符,所以在java中编写正则表达式的时候,需要转移符的时候需要些 两个 \
-
字符取值范围相关
-
[abc] : 表示 可能是a, 也可能是b, 也可能是c (是abc中的任意一个)
-
[^abc] : 表示不是a,b,c中的任何一个
-
[a-zA-Z] : 表示是大小写字母 , [a-z] 小写字母 , [A-Z] 大写字母 [0-9] 数字0-9
-
[a-zA-Z0-9] : 表示是数字或字母
-
简洁表示
-
. : 匹配任意字符
-
\d : 表示数字 等同于[0-9]
-
\D : 表示非数字 等同于 [^0-9]
-
\s : 表示由空字符组成, [\t\n\r\x\f]
-
\S : 表示非空字符组成
-
\w : 表示由字母数字下划线组成 [a-zA-Z0-9_]
-
\W : 表示非字母数字下划线 [^a-zA-Z0-9_]
-
表示数量的
-
? : 表示出现0次或1次
-
+: 表示1次或多次, 大于等于1
-
* : 任意次数(0~N)
-
{n} : 表示出现n次 , {2} 表示出现2次
-
{n,m} : 表示出现n次到m次 , {2,5} : 表示出现2~5次
-
{n,} : 表示出现n及以上 >=n
-
() : 把他们看做一个整体
-
| 或 , a|b ,a和b都可以匹配
-
^ : 以什么什么打头 , 但是 用在[^xxxx] 就表示取反
-
$ : 以什么什么结尾
-
a[a-z] , a1 , aA , a3, 22
-
校验非汉字
-
[^\u4e00-\u9fa5]
-
Pattern : 创建正则表达式对象,能做一些基本的简单操作
-
三大功能 :
-
验证 : boolean matchers(String regex);
-
拆分 : String[] split(String regex);
-
替换 : String replaceAll(String regex,String replacement);
-
实际操作中,有时候我们嫌麻烦,也可以直接使用String里面的一些方法,比如 替换,拆分,验证String类中也有的
public static void main(String[] args) {
// test_01();
test_02();
}
// 验证 : boolean matchers(String regex);
public static void test_02() {
String regex = "(-)?\\d+(\\.\\d+)?";
String str = "2.43";
// 全词匹配
boolean flag = Pattern.matches(regex, str);
System.out.println(flag);
// String类中的用法,也是全词匹配
System.out.println(str.matches(regex));
}
// 拆分 String[] split(String regex);
public static void test_01(){
String str = "1,2@3!4";
// 创建正则表达式对象
Pattern pattern = Pattern.compile("[^0-9]");
String[] strArray = pattern.split(str);
for (String string : strArray) {
System.out.println(string);
}
// String的
String[] strArray1 = str.split("[^0-9]");
for (String string : strArray1) {
System.out.println(string);
}
}
public static void main(String[] args) {
String regex = "\\d{11}";
String tel = "a131131131112";
// 引擎
Pattern pattern = Pattern.compile(regex);
// 匹配器
Matcher matcher = pattern.matcher(tel);
// 三种匹配模式
// matches : 全词匹配 xxx
// find : 任意位置均可 .*xxx.*
// lookingAt : 从前到后 xxx.*
// 全词匹配 , 等于写着 ^ 和 $
System.out.println(matcher.matches());
// 注意 : 一个匹配器对象(matcher) ,调用相同的方法可以连用,不建议混用
matcher = pattern.matcher(tel);
// 只要最前面的是符合条件的 就行
System.out.println(matcher.lookingAt());
matcher = pattern.matcher(tel);
// 任意位置符合条件 就行
System.out.println(matcher.find());
}
//数据提取
public static void main(String[] args) {
// 可以使用() 对匹配到的数据进行分组, 第一个() 就是第一组,第二个() 就是第二组
// 也可以不分组,如果不分组的情况下做数据提取,就只能提取到整个匹配到的字符串
// 分组之后 可以提取对应组的数据
// ((.{2,3})电话号码是) 第一组
// (.{2,3}) 第二组
// (\\d{11}) 第三组
String string = "张三电话号码是13113113111张三四电话号码是13113113112张三五电话号码是13113113113张四电话号码是13113113114王五电话号码是13113113115赵六电话号码是13113113333孙小黑电话号码是13113113211小红电话号码是13113113311";
String regex = "((.{2,3})电话号码是)(\\d{11})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
// find 匹配任意位置,匹配到一个之后就停止
// 如果接着调用find方法,就会接着刚停止的地方继续向后面匹配
while (matcher.find()) {
// 所以 结合find特性,可以和group连用,做到数据提取
// group : 0或者无参, 获取匹配到的整个数据,1 就是第一组,2就是第二组
// 一个小括号 就是一组
System.out.println(matcher.group(2) + " : " + matcher.group(3));
}
}