正则表达式用于匹配指定规则的字符串
测试字符串是否匹配正则表达式:
public static void main(String[] args) {
String s = "a";//目标字符串
String regex = "[abc]";//正则表达式
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
System.out.println(m.matches());
}
限定符:
字符 | 用法 | 示例 | 匹配字符串 |
? | 匹配0或1次 | ab?c | abc、ac |
* | 匹配0或多次 | ab*c | ac、abc、abbbc |
+ | 匹配至少1次 | ab+c | abc、abbc |
{n} | 匹配恰好n次 | ab{2}c | abbc |
{n,} | 匹配至少n次 | ab{2,}c | abbc、abbbc |
{n,m} | 匹配次数在n到m之间,包括n,m | ab{2,4}c | abbc、abbbbc |
"或"运算:
字符 | 用法 | 示例 | 匹配字符串 |
| | 或运算 | ab(c|d) | abc、abd |
字符类:
字符 | 用法 | 示例 | 匹配字符串 |
() | 分组,()内为一个整体 | a(bc)*d | ad、abcbcd |
[] | 匹配的字符只能从方括号中取 | [abc] | a、b、c |
[n-m] | 同上,同时匹配字符从n到m中取 | [a-z] | a、f、n |
[^] | 取 ^ 后字符以外的字符 | [^a-z] | 除小写字母以外皆可 |
元字符(注意Java中需使用转义字符,如"\d"需写成"\\d"):
字符 | 用法 | 示例 | 匹配字符串 |
\d | 数字字符 | \d+ | 123 |
\D | 非数字字符,同[^0-9] | \D | a、_ |
\w | 英文、数字、下划线 | \w+ | a1_2b |
\W | 非(英文、数字、下划线)字符 | \W | 1 |
\s | 空白符(包含Tab和换行符) | \s | (空格) |
\S | 非空白符 | \S | a、1 |
. | 代表除换行符外的任意字符 | .+ | ab_123 |
^a | 匹配首字符为a的字符串(不能单用,要配合使用) | ^ab+c | abbc |
a$ | 匹配尾字符为a的字符串(同上) | ab*c$ | ac、abbbc |
断言(匹配的内容不包括断言部分,即(?=<body>).*匹配到的字符串仅是.*):
字符 | 用法 | 示例 | 匹配字符串 |
(?=pattern) | 正向先行断言,该位置左侧的字符序列能匹配该pattern | .*(?=<title>) | abc<title> |
(?!pattern) | 负向先行断言,该位置左侧的字符序列不能匹配该pattern | .*(?!<title>) | abc<lr> |
(?<=pattern) | 正向后行断言,该位置右侧的字符序列能匹配该pattern | (?<=<title>).* | <title>abc |
(?<!pattern) | 负向后行断言,紧接该位置之前的字符序列不能匹配该pattern | (?<!<title>).* | <lr>abc |
贪婪匹配、惰性匹配与支配匹配:
贪婪匹配(Greediness):在整个表达式匹配成功的提前下,尽可能多的匹配,默认
惰性匹配(Laziness):与贪婪匹配相反,尽可能少的匹配,在末尾加?
支配匹配(Possessive):只尝试匹配整个字符串,在末尾加+