JAVA 正则表达式 作者:马育民 • 2020-01-26 21:34 • 阅读:10098 需要掌握:[正则表达式](https://www.malaoshi.top/show_1IX2yvsAZgmZ.html "正则表达式") # java中的 `\\` 在 Java 中,使用 **正则表达式** 的 **特殊符号** 时,前面需要用 `\\` 转义。 相当于 `\t` 表示制表符 在其他语言中,一般使用 `\ ` 表示 需要转义的符号有: ``` . * + $ \/ ? ^ [ ] ( ) { } ``` # JAVA 与 正则表达式 JAVA 处理正则表达式的类都在`java.util.regex` 包 ### Pattern 类 Pattern 类没有公共构造方法。要创建 Pattern 对象,通过调用下面静态方法: `public static Pattern compile(String regex)` `public static Pattern compile(String regex, int flags)` 返回 Pattern 对象。该方法第一个参数是 **正则表达式** ### Matcher 类 Matcher 对象是对输入字符串进行解释和匹配操作的引擎。Matcher 也没有公共构造方法,通过调用下面静态方法 要创建 Matcher 对象: `public Matcher matcher(CharSequence input)` 传入要匹配的字符串,返回 Matcher 对象。 ### Matcher 类的常用方法 - matches():判断整个字符串是否完全匹配正则表达式 - find():查找字符串中是否存在匹配的子串(可多次调用,每次找下一个) - group():获取匹配到的子串(配合 find() 使用),group(n) 可获取第 n 个分组的内容 - replaceAll(String replacement):替换所有匹配的子串 - replaceFirst(String replacement):替换第一个匹配的子串 # Matcher 类的 matches()方法 判断整个字符串是否完全匹配正则表达式 ### 例子 ``` //编译正则表达式 Pattern p = Pattern.compile("\\d+"); //传入要匹配的字符串,返回 Matcher 对象 Matcher m = p.matcher("123"); //进行匹配 boolean b=m.matches(); System.out.println(b); ``` ### Pattern 简化 Pattern 类有下面静态方法,简化操作: `public static boolean matches(String regex, CharSequence input)` 该方法源代码如下: ``` Pattern p = Pattern.compile(regex); Matcher m = p.matcher(input); return m.matches(); ``` **例子:** ``` boolean b=Pattern.matches("\\d+","123"); System.out.println(b); ``` ### String 简化 String类有下面方法,简化匹配操作 `public boolean matches(String regex)` 该方法源代码如下: ``` return Pattern.matches(regex, this); ``` **例子:** ``` boolean b="123".matches("\\d"); System.out.println(b); ``` # Matcher 类的 find() 方法 查找字符串中是否存在匹配的子串(可多次调用,每次找下一个) ### 例子 ``` String text = "2002年asdf2005年2389423,2019年"; String patternStr = "\\d\\d\\d\\d年"; Matcher matcher = Pattern.compile(patternStr).matcher(text); int count = 0; while (matcher.find()) { count++; } System.out.println("年份出现次数:"+count); ``` 执行结果: ``` 年份出现次数:3 ``` # Matcher 类的 group() 方法 提取匹配正则表达式的子串(配合 `find()` 使用) ``` String text = "2002年asdf2005年2389423,2019年"; String patternStr = "\\d\\d\\d\\d年"; Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(text); // 必须执行find(),否则报错 while (matcher.find()) { System.out.println(matcher.group()); } ``` 执行结果: ``` 2002年 2005年 2019年 ``` # Matcher 类的 group(n) 方法 可获取第 n 个分组的内容 ``` String text = "2002年01月20日asdf2005年02月10日2389423,2019年10月25日"; // 正则表达式中,一个 () 就是一组 String patternStr = "(\\d\\d\\d\\d年)(\\d\\d月)(\\d\\d日)"; Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println(matcher.group(0)); // 0表示提取整个匹配字符串 System.out.println(matcher.group(1)); // 1表示提取第1组,即:\\d\\d\\d\\d年 System.out.println(matcher.group(2)); // 2表示提取第2组,即:\\d\\d月 System.out.println(matcher.group(3)); // 3表示提取第3组,即:\\d\\d日 } ``` # 例子 ### 验证手机号 移动号段正则表达式 ``` String regex="^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$"; boolean flag = "13811111111".matches(regex);//判断功能 System.out.println(flag); ``` 正则表示式意思: - `^`:表示以后面这些数字为开始 - `((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))`:有小括号,这些是一组,相当于数学中的小括号,表示优先级。 - `[4-9]`:表示4-9之间的数字都符合 - `|`:表示 或者 表示前3位:134、135、136、137、138、139、147、150、151、152,157、158、159、178、182、183、184、187、188 - `\\d{8}`:表示8个任意数字 - `|(1705)\\d{7}`:表示或者1705号段,后面是7个任意数字 - `$`:表示匹配字符串结尾 ### 替换字符串 ``` //将下面字符串中,数字替换成【JAVA】 String str="wp3ofe1hwpeojf5哦I啊6我哦"; String str2=str.replaceAll("\\d","【JAVA】"); System.out.println(str); System.out.println(str2); ``` 感谢: https://www.runoob.com/java/java-regular-expressions.html 原文出处:http://malaoshi.top/show_1EF4tkPXc2dh.html