企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## Java专题七:正则表达式 [TOC] ### 7.1.String类中的正则方法 ``` // java.lang.String public String[] split(String regex) { return split(regex, 0); } public String[] split(String regex, int limit) { // ... return Pattern.compile(regex).split(this, limit); } public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); } public String replaceFirst(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceFirst(replacement); } public boolean matches(String regex) { return Pattern.matches(regex, this); } ``` ### 7.2.Pattern类与Matcher类 - input:输入字符串 - regex:正则表达式 - pattern:编译后的正则表达式 首先通过Pattern的静态方法`public static Pattern compile(String regex)`将regex进行编译成pattern,然后通过Matcher的`Matcher matcher(CharSequence input)`构造Matcher对象,调用Matcher对象的一些方法能实现对字符串的搜索、查找、替换。 **Pattern方法**: | 方法 | 说明 | | ------------ | ------------ | | public static Pattern compile(String regex) | 编译regex成pattern | | public static Pattern compile(String regex, int flags) | 编译regex成pattern,并携带参数 | | public String[] split(String regex) | 使用pattern分割输入字符串input | | public String[] split(CharSequence input, int limit) | 使用pattern分割输入字符串input,参数详细见下面limit说明 | | public Matcher matcher(CharSequence input) | 构造一个Matcher对象 | - **Pattern#compile**方法flags说明: | 语句 | 解释及内嵌语法 | | --- | --- | | Pattern.UNIX_LINES| -| | Pattern.CASE_INSENSITIVE | 不区分大小写| | Pattern.COMMENTS| 以#开头到行尾的字符被忽略| | Pattern.MULTILINE| 匹配多行| | Pattern.LITERAL| 不进行转义字符转义 | | Pattern.DOTALL| 匹配任意字符,包括换行符 | | Pattern.UNICODE_CASE| - | | Pattern.CANON_EQ| - | - **Pattern#split**方法limit说明: 假设input按照pattern能分成n份,如果limit=0,则分割成n份,如果limit < n,则分成limit份,如过limit > n, 则分成n份,具体如下: String input = "1123435345@qq.com"; | 语句 | 结果 | | ------------ | ------------ | | input.split("3") | [112, 4, 5, 45@qq.com] | | input.split("3", 1) | [1123435345@qq.com]| | input.split("3", 2) | [112, 435345@qq.com]| | input.split("3", 5) | [112, 4, 5, 45@qq.com] | **Matcher方法**: | 方法 | 说明 | | ------------ | ------------ | | public boolean matches() | 判断pattern是否完全匹配input所有字符,匹配返回true | | public String replaceAll(String replacement) | 替换所有input中匹配到pattern的字符串 | | public String replaceFirst(String replacement) | 替换input中第一次匹配到pattern的字符串 | **Pattern与Matcher结合使用方法**: ``` public class RegTest { public static void main(String[] args) { String source = "1123435345@qq.com"; Pattern pattern = Pattern.compile("^([\\d]+)@(.+?[.].+)$"); Matcher matcher = pattern.matcher(source); while ( matcher.find() ) { String email = matcher.group(0); String account = matcher.group(1); String domain = matcher.group(2); System.out.println(email); System.out.println(account); System.out.println(domain); System.out.println(matcher.group(3)); } } } ``` 输出结果如下: ``` 1123435345@qq.com 1123435345 qq.com Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 3 at java.util.regex.Matcher.group(Matcher.java:538) at java0.RegTest.main(RegTest.java:19) ``` ### 7.3.常见[正则表达式](http://www.regular-expressions.info/)语法 <table> <tr> <td>类型</td> <td>字符</td> <td>解释</td> </tr> <tr> <td bgcolor=#ffc7ce>bound</td> <td bgcolor=#ffc7ce>^</td> <td bgcolor=#ffc7ce>匹配字符串开始标志</td> </tr> <tr> <td bgcolor=#ffc7ce>bound</td> <td bgcolor=#ffc7ce>$</td> <td bgcolor=#ffc7ce>匹配字符串结尾标志</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce>. </td> <td bgcolor=#c6efce>匹配任一字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce>x|y </td> <td bgcolor=#c6efce>匹配x字符或y字符,通常使用为(x|y)</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> [xyz] </td> <td bgcolor=#c6efce>匹配xyz中的任一字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> [^xyz] </td> <td bgcolor=#c6efce>匹配不包含xyz中的任一字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> [a-z] </td> <td bgcolor=#c6efce> 匹配(a,z)范围内的任一字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce>[^a-z] </td> <td bgcolor=#c6efce> 匹配不在(a,z)范围内的任一字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \d </td> <td bgcolor=#c6efce> 匹配数字字符,相当于[0-9]</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \D </td> <td bgcolor=#c6efce> 匹配非数字字符,相当于[^0-9]</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \t </td> <td bgcolor=#c6efce> 匹配制表符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \s </td> <td bgcolor=#c6efce> 匹配空白字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \S </td> <td bgcolor=#c6efce> 匹配非空白字符</td> </tr> <tr> <td bgcolor=#c6efce>char</td> <td bgcolor=#c6efce> \n </td> <td bgcolor=#c6efce> 匹配换行符</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> * </td> <td bgcolor=#ffeb9c> 匹配零次或多次字符或字符串组合</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> ? </td> <td bgcolor=#ffeb9c> 匹配零次或一次字符或字符串组合</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> + </td> <td bgcolor=#ffeb9c> 匹配零次或多次字符或字符串组合</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> {m} </td> <td bgcolor=#ffeb9c> 匹配m次字符或字符串组合</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> {m,} </td> <td bgcolor=#ffeb9c> 匹配至少m次字符或字符串组合</td> </tr> <tr> <td bgcolor=#ffeb9c>times</td> <td bgcolor=#ffeb9c> {m,n} </td> <td bgcolor=#ffeb9c> 匹配至少m次,至多n次字符或字符串组合</td> </tr> <tr> <td bgcolor=#00b0f0>advanced</td> <td bgcolor=#00b0f0> ? </td> <td bgcolor=#00b0f0> 紧跟在类型为times的后面,如+?,为非贪心的,匹配尽可能短的字符或字符串组合</td> </tr> <tr> <td bgcolor=#00b0f0>advanced</td> <td bgcolor=#00b0f0> (pattern) </td> <td bgcolor=#00b0f0> 匹配pattern并捕获组,能通过group查找子表达式</td> </tr> <tr> <td bgcolor=#00b0f0>advanced</td> <td bgcolor=#00b0f0> (?:pattern) </td> <td bgcolor=#00b0f0> 匹配pattern但不捕获组</td> </tr> </table>