正则表达式--位置匹配和组
1. 位置匹配
正则中的匹配有两种,一种是匹配具体的字符,另一种是匹配特定的位置
^ 匹配文本开始位置
$ 匹配文本结束位置
\b 匹配单词边界(单词开始位置或结束位置)
校验操作时,是否使用 ^和$ 对校验操作没有影响
获取、替换等操作时,一般不使用 ^和$
String regex = "\\bhello\\b"; String str = "xx hello,hello helloa "; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String group = matcher.group(); System.out.println(group); }
输出:
hello
hello
2. 组
正则使用 ( ) 表示一个组,组可以让若干字符形成一个小整体
(ab) 匹配 ab
(red|blue|green) 匹配 red 或者 blue 或者 green
(red|blue|green) color 匹配 red color 或者 blue color 或者 green color
在匹配时,组的当前 "取值" 会被临时保存起来,方便引用。可以使用 \1 引用第一个组的当前"取值",最多可以引用九个不同的组:\9
(ab)c\1 匹配 abcab
([ab])\1 匹配 aa 或者 bb
(a)(b)\1\2 匹配 abab
String regex = "(a)(b)\\1\\2";
String str = "abab";
boolean match = Pattern.matches(regex, str);
System.out.println(match);
输出:
true
3.标记flag
标记用来额外指定正则的匹配策略(标记可以不写在正则表达式内)
i 大小写不敏感 insensitive(也可以理解成ignore)
g 全局匹配 global 效果是可以依次的获取到和正则匹配的所有子字符串
m 多行匹配 multiline 效果是^和$可以匹配一段文本中每行的开始和结束位置
在Java中:
在创建正则对象时可以通过 Pattern.compile(regex, flags) 指定标记
使用Pattern.CASE_INSENSITIVE 常量表示 i
使用Pattern.MULTILINE 常量表示 m
正则操作默认就是全局匹配的
String regex = "\\bhello\\b"; String str = "xx Hello,heLLo helloa "; // Pattern pattern = Pattern.compile(regex); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String group = matcher.group(); System.out.println(group); }
输出:
Hello
heLLo
4.常用正则表达式
校验数字:^[0-9]*$
校验整数或者小数:^[0-9]+([.][0-9]+){0,1}$
校验qq号:[1-9][0-9]{4,}
校验手机号: ^1[34578]\d{9}$
校验身份证:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$)
校验日期(格式:yyyy-mm-dd,已考虑平闰年):^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
校验email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
校验URL:^[a-zA-z]+://[^\s]*$
注意:以上常用正则并不保证完全满足需求,使用前请充分测试