正则表达式有6种元字符:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符
使用正则表达式的一般形式:
public class RegExptest{
public void RegExp_(){
//保存需要匹配的字符串
String str = "String";
//保存匹配模式
String regstr = "//d";
//创建正则表达式对象
Pattern pattern = Pattern.compile(regstr);
//创建匹配器
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
限定符的说明:
符号 | 含义 | 示例 | 说明 |
* | 指定字符0-N次 | (abc)* | 仅包含任意个abc |
+ | 指定字符1-N次 | m+(abc)* | 至少1个m |
? | 指定字符0-1次 | m+abc? | 至多一个c |
{n} | 匹配字符串中长度为n的子字符串 | [abcd]{3} | 可以匹配到abc、bcd |
{n,} | 指定至少匹配n长度的子字符串 | [abcd]{3,} | 可以匹配到abcd任意长度不小于3的子字符串 |
{n,m} | 指定匹配n-m长度的子字符串 | [abcd]{3,4} | 可以匹配到abcd任意长度3-4的子字符串,默认采用贪婪模式,尽可能的匹配最长子字符串 |
选择匹配符的说明:
| | 匹配符号前后的或规则 | ab|cd | 可以匹配ab或cd |
分组是指匹配模式中再进行分组,有五种模式:
1、(Pattern)非命名捕获,匹配模式中第一个括号编号为1,也就是Pattern.group(1)
2、(?Pattern)命名模式,name不能有任何标点符号,且不能数字开头,尖括号可以用单引号代替
3、(?:pattern)等价于(pattern1|pattern2|pattern3)
4、(?=pattern)非捕获匹配,如Window(?=95|95|NT|2000),匹配“Window2000”,匹配结果是Window
5、(?!pattern)跟上面相反
字符匹配符的说明:
[] | 可接收的列表 | [abcd] | a、b、c、d中的任意一个字符 |
[^] | 不接收的列表 | [^abcd] | 除a、b、c、d之外的任意一个字符 |
- | 连字符 | A-Z | 任意单个大写字母 |
. | 除\n以外的任意一个字符 | a..b | a和b中间包含任意两个字符 |
\\d | 单个数字字符 | \\d{3}(\\d)? | 包含3个或者4个数字字符 |
\\D | 单个非数字字符 | \\D(\\d)* | 以非数字字符开头,连串数字字符结尾 |
\\w | 单个数字、大小写字母 | \\d{3}\\w{4} | 3个数字字符加上4个数字、大小写字母字符组成的字符串 |
\\W | 非单个数字、大小写字母 | \\W+\\d{2} | 至少一个非单个数字、大小写字母外加2个数字字符 |
\\s | 任何空白字符(空格、制表符等) | \\s | 匹配空白字符 |
\\S | 任何非空白字符(空格、制表符等) | \\S | 匹配非空白字符 |
如果想不区分的话,可以在表达式对象添加一个参数
Pattern pattern = Pattern.compile(regstr,Pattern.CASE_INSENSITIVE);
还有另一种方式:(?i)abc
代表匹配abc时不区分大小写
定位符的说明:
^ | 指定起始字符 | ^[0-9] | 以数字开头 |
$ | 指定结束字符 | [0-9]$ | 以数字结尾 |
\\b | 匹配字符串的边界 | han\\b | 有空格或者结尾 |
\\B | 匹配字符串的非边界 | han\\b | 没有空格或者非结尾 |