本文共 2497 字,大约阅读时间需要 8 分钟。
正则表达式用于匹配、校验字符串。
符号 | 描述 |
---|---|
. | 小数点,可匹配\n之外的任何一个字符,要匹配小数点,用\. |
x | x是某一具体字符,表示匹配该字符 |
\d | 匹配0-9之间的一个数字 |
\D | 匹配\d之外的任一个字符 |
\s | 匹配任一个空白,包括空格、制表符、回车符、换行符 |
\S | 匹配\s之外的任一个字符 |
\w | 匹配任一个单词字符,包括数字0-9,英文字母大写26个、小写26个,下划线_ |
\W | 匹配\w之外的任一个字符 |
\t | 匹配空格、Tab之类的空白符 |
\n | 换行符 |
\r | 回车符 |
以上式子均只匹配一个字符
符号 | 描述 |
---|---|
\ | 转义,匹配正则表达式中的预定义的符号,例:\\匹配一个\, \(匹配一个(, \?匹配一个? |
| | 2项中选择一项,或,例:ab|c表示匹配ab或ac |
() | 作为整体看待 |
中括号
符号 | 描述 |
---|---|
[ ] | 匹配指定范围中的任一个字符,例:[abc]表示匹配a、b、c中的任一个字符。 |
- | 连续范围,例:[a-z]表示匹配所有小写字母中的任一个字符,[\u4e00-\u9fa5]表示匹配任意一个中文字符 |
^ | 非,例:[^a-d]表示匹配a、b、c、d之外的任一个字符。^会把后面的部分作为一个整体,eg. [^a-zA-Z0-9!@-],会把a-zA-Z0-9!@-作为一个整体 |
&& | 交集,例:[a-d&&c-z]相当于[cd],匹配c、d中的任一个字符 |
中括号只匹配一个字符
符号 | 描述 |
---|---|
* | >=0,至少0个 |
+ | >=1,至少1个 |
? | 0个或1个 |
{m} | m个 |
{m,} | 至少m个 |
{m,n} | 至少m个,至多n个 |
限定的是前一个字符、子表达式出现的次数
符号 | 描述 |
---|---|
^ | 行的开头,放在该部分前面,例:^H 表示匹配H,H要是一行的开头 |
$ | 行的结尾,放在该部分的后面,例:o$ 表示匹配o,o要是一行的结尾 |
\b | 单词的边界,前边界就放在该部分的前面,后边界就放在该部分的后面,例:\bH 表示匹配H,H要是单词的开头;H\b表示匹配H,H要是单词的结尾。 |
\B | 不是单词的边界。不是前边界就放在该部分的前面,不是后边界就放在该部分的后面,例:\BH 表示匹配H,H不能是单词的开头;H\B表示匹配H,H不能是单词的结尾。 |
以上均是对一个字符、子表达式位置的说明。
1、Greedy(贪婪模式
数量限定默认使用贪婪模式,尽可能多的匹配字符。例:\w{ 2,5} 能匹配5个就匹配5个,不行就4个,再不行就3个...\w? ?表示匹配0个或1个,会优先匹配1个,没有才匹配0个\w+ +表示匹配1个及以上,优先匹配最多个
2、Reluctant(勉强模式)
尽可能少的匹配字符,也称最小匹配模式。需要在数量限定符后用一个额外的?来表示该部分使用最小匹配模式。例:\w{ 2,5}? 优先匹配2个\w?? ?匹配0或1个,优先匹配0个\w+? +匹配1个及以上,优先匹配1个
?放在数量限定符后面,才表示前面部分使用最小匹配模式。
3、Possessive(占有模式)
在数量限定符后面用一个额外的+来表示该部分使用占有模式,这个不常用。
两种方式
// 整串匹配,用regex匹配整串boolean matches(String regex)"hello".matches("hello") //true"hello".matches("he") //false。 // 替换第一个匹配, 第一个参数是要匹配的串,正则表达式String replaceFirst(String regex, String replacement) // 替换所有匹配String replaceAll(String regex, String replacement) //效果和replaceAll完全相同,只是第一个参数只能是字符、字符串,不能使用正则表达式String replace(String target, String replacement) // 以regex作为切割符,把该串分割为字符串数组String[] split(String regex)
实例
//去除中文字符str = str.replaceAll("[\u4e00-\u9fa5]","");//正则表达式匹配特定字符串str = str.replaceAll("hello","hi");
替换操作,原串不变,以新串形式返回。
正则表达式不用放在/ /中,直接写即可,但正则表达式预定义的字符要用\转义,又因为是在字符串中,\本身也要用\转义,所以转义要用 \\
// 获取正则表达式对象Pattern p=Pattern.compile(String regex);// 创建Matcher对象,参数指定要匹配的字符串Matcher m=p.matcher(String str); // 用Matcher对象来操作boolean b=m.matches(); //整串匹配boolean b=m.find(); //匹配子串String str=m.replaceFirst(String replacement); //用指定字符串替换第一个匹配String str=m.replaceAll(String replacement); //用指定字符串替换所有匹配
1、本来匹配正则表达式中预定义的符号要转义,比如匹配? 要写成 ? ,
但java把正则表达式作为字符串放在双引号中,只需转义\,比如 \w => “\w”,
其它预定义的符号,比如?、+、()、[ ]等等,不需要再用\转义。
2、对于常用的正式表达式,eg.匹配手机号、邮箱、网址等,可以找一个在线生成正则表达式的网站,直接粘过来用
转载地址:http://rgqlb.baihongyu.com/