依赖包:
java.util.regex,其主要包含三个类 Matcher、Pattern和非强制性异常PatternSyntaxException。
在Java中,\代表转义字符,常见的如\n表示换行,\t表示制表符。想要单独表示反斜线则用\\。双反斜线表示一个反斜线,前一个表示转义,后一个表示要表示的字符。
在正则表达式中,需要\\\\表示一个反斜线。前两个代表一个反斜线,后两个也代表一个反斜线。正则表达式中反斜线同样需要转义,前两个是为后面两个转义用的,所以需要四个反斜线。同理,\\d中的第一个反斜线表示转义,而后面的\d表示任意一个数字。
样例解析:
(Java正则表达式匹配IP地址)
//匹配IP地址 [0-255].[0-255].[0-255].[0-255]
String pattern = "^((2[0-4]\\d|25[0-5]|[0-1]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[0-1]?\\d\\d?)$";
Pattern compile = Pattern.compile(pattern);
Matcher matcher = compile.matcher(ip);
System.out.println(matcher.matches()); //全匹配,返回true或false
//System.out.println(matcher.lookingAt()); //包含匹配,匹配的字符串必须在整串的最前面
//System.out.println(matcher.find()); //包含匹配,匹配的字符串可以在任何位置
pattern表示的含义是:
2[0-4]\\d 【2[0到4]任意数字】《200-249》 |
25[0-5] 【25[0到5]】《250-255》|
[0-1]?\\d\\d? 【0到1】(可无)任意数字任意数字(可无)《0-199》
\\. 转义表示.
{3}表示重复3次,x.x.x.
最后一位和上述相同
正则表达式常用基础:
\d 表示任意一个数字
\w 表示任意一个数字字母或下划线 0-9 a-z A-Z _
\s 表示任意空白字符,包括空格、制表符、换页符
对应的大写字母具有相反意义
. 表示匹配除了换行符\n以外的任意字符
使用方括号[]包含一系列字符,能够匹配其中任意一个字符。如[ab#]表示匹配a或b或#。
使用^表示匹配除了其中字符外的任意字符,如[^a-f0-3]表示匹配除了a-f和0-3之外的任一字符
使用{}放在表达式后面表示匹配次数,如a{3}表示aaa,
{m,n}表示最少匹配m次,最多匹配n次。{m,}表示最少匹配m次,没有次数上限。
?表示匹配0次或1次,相当于{0,1}
+表示最少匹配1次,相当于{1,}
*表示匹配0次或任意次,相当于{0,}
^ 与字符串开始的地方进行匹配 ,例子 ^aaa 匹配 xaaaxxx不成功 ,匹配aaaxxxx成功
$ 与字符串结束的地方进行匹配 ,例子 aaa$ 匹配 xaaaxx不成功,匹配xxxaaa成功
\b 匹配单词边界,不匹配任何字符,例子 "\\bend\\b",表示匹配end这个单词单独出现,而非end嵌入在某个单词中
| 表示左右两边表达式之间获的关系,匹配左边或右边
正则表达式贪婪匹配和非贪婪匹配
使用 + 和 * 会尽可能多的匹配内容,即贪婪模式
使用 ? 会尽可能少的匹配内容,即非贪婪模式
进阶-反向引用
表达式匹配字符串可以使用前面已经匹配到的字符,\\1代表第一对括号内匹配到的字符串,同理\\2代表第二对括号内匹配到的字符串。
例子: String pattern="('|\")(.*?)(\\1)",表示匹配' '或者" "之间的内容
String pattern3 = "('|\")(.*)(\\1)";
String x = "'hello',\"world\"";
Pattern compile = Pattern.compile(pattern3);
Matcher matcher = compile.matcher(x);
while(matcher.find()){
System.out.println(matcher.group());
}
输出结果是'hello' "World"