Java 正则表达式
Java
的匹配默认为贪婪匹配,尽可能多的去匹配。
匹配规则
规则 | 作用 | 示例 | 示例说明 |
---|---|---|---|
[] | 可接收的字符列表 | [efg] | 可接收e、f、g中任意一个字符 |
[^] | 不接收的字符列表 | [^efg] | 除e、f、g之外的任意一个字符 |
- | 连字符 | A-Z | 任意一个大写字母 |
. | 匹配除\n为的任意字符 | a…b | 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 |
\\d |
匹配单个数字字符 | \\d{3}\\d? |
匹配 3 个或 4 个数字的字符串 |
\\D |
匹配单个非数字字符 | \\D(\\d)* |
以单个非数字开头, 后接任意个数的数字字符串 |
\\w |
匹配单个数字、大小写字母的字符以及下划线 | ||
\\W |
与 \\w 相反 |
\\W+ |
以至少1个非数字字母开头的字符串 |
\\s |
匹配单个空白符 | ||
\\S |
匹配非空白符 | ||
(?i) | 符号之后的内容都不区分大小写了,除非用括号指定范围 | ||
^ | 指定起始字符 | 1+[a-z]* | 表示以至少一个数字开头, 后接任意个数的小写字母组成的字符串 |
$ | 指定结束字符 | [a-z]+$ | 表示以至少一个小写字母结尾的字符串 |
\\b |
匹配目标字符串的边界。这里的边界指的是字符串之后跟空白字符为边界,或者就是整个字符串的最后 | ||
\\B |
匹配目标字符串的非边界 | ||
? | 单独使用,匹配0或1个出现的前一个表达式;与其他匹配符号一起使用,表示非贪婪匹配 | ||
* | 匹配0个或多个出现的前一个表达式。 | ba*$ | 以 b 或 ba…结尾的字符串 |
+ | 匹配1个或多个出现的前一个表达式 | ^a+ | 开头至少有 1 个 a 的字符串 |
{n} | 匹配正好n次出现的前一个表达式 | ||
{n,} | 匹配至少n次出现的前一个表达式 | ||
{n,m} | 匹配至少n次且不超过m次出现的前一个表达式 | ||
| | 匹配两个或多个表达式之一 |
初体验
使用 Java
正则表达式匹配4个连在一起的阿拉伯数字。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 使用正则表达式匹配4个连在一起的阿拉伯数字。
*/
public class RegExp01 {
public static void main(String[] args) {
String content = "1889xcj+dsb&c1198cdj==fhs7863xbc-ndb34ms_ndc3dh%fjc";
// 目标:匹配4个连在一起的数字
String regStr = "\\d\\d\\d\\d";
// 创建模式匹配对象
Pattern pattern = Pattern.compile(regStr);
// 创建匹配器
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
}
}
}
分析 matcher.find()
以上面给出的代码分析:
-
根据指定的规则,定位满足规则的 子字符串,比如: 1889。
-
找到后,将 子字符串 开始的索引记录到
matcher
对象的groups
属性中(int[] groups)。groups[0] = 0, 把该子字符串的 结束索引+1 的值记录到 group[1] = 4,
同时记录
oldLast
的值为子字符串
的结束索引+1
, 即 4,下次执行find()
时, 就从 4 开始匹配。 -
matcher.group(0)
根据
groups[0]
和group[1]
记录的位置, 从content
开始截取子字符串返回。源码
public String group(int group) { if (first < 0) throw new IllegalStateException("No match found"); if (group < 0 || group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); if ((groups[group*2] == -1) ||