java中正则表达式的运用及示例

限定符(量词):

*表示零次或多次,+表示至少一次,?表示最多一次。{n}表示n次,{n,}表示至少n次。

中括号表达式:

[]表示或. 如[afg]表示一个为a或者f或者g的字母。

中括号内的-表示范围。[0-9]表示数字0到9中的一个,[0-9]+表示至少一个数字。

[A-Za-z]表示一个任意字母。[A-Za-z]+表示任意多个字母。

中括号内的^表示非。[^xyz]表示任意不包含xyz的字符。比如123,abc之类的。

中括号表达式的匹配示例如下:

String str="abdf1459";
//匹配4个小写字母,接着是4个数字
String regex="[a-z]{4}[0-9]{4}";
if (str.matches(regex)) {
    System.out.println(true);
}

此处的str.matches(regex)相当于:

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.matches()){
    //...
}

中括号表达式的替换示例如下:

String test="123xyz456abc";
//将xyz和abcd这些字母,都替换成0
//String result = test.replaceAll("[x-za-d]", "0");
//将所有的非数字,都替换成0
String result = test.replaceAll("[^0-9]", "0");
System.out.println(result);

小括号

(xyz) 字符组,按照确切的顺序匹配字符xyz。

元字符:

.

.可以匹配除换行符之外的任何单字符。比如.*表示任意个非换行符\n的字符。

String str="abcdddabc";
//  .*c+.*则表示以任意非换行符\n开始,中间包含至少一个c字符,并且以任意非\n字符结束。
String regex=".*c+.*";
if (str.matches(regex)){
    System.out.println(true);
}

|

| 表示或。

比如 x|y ,可以匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

^和$

^匹配字符串的开始位置。而$匹配字符串的结尾位置。

^cat : 验证该行以c开头紧接着是a,然后是t。

cat$ : 验证该行以t结尾倒数第二个字符为a倒数第三个字符为c。

^cat$ : 以c开头接着是a->t然后是行结束:只有cat三个字母的数据行。

匹配的示例,如下所示:

String str="catdog";
//regex只能匹配cat
String regex="^cat$";
//regex2可以匹配cat开头的字符串
//.*表示任意个非换行符\n的字符
String regex2="^cat.*";
//regex3可以匹配dog结尾的字符串
String regex3=".*dog$";
boolean isMatch1=str.matches(regex);
boolean isMatch2=str.matches(regex2);
boolean isMatch3=str.matches(regex3);
System.out.println(isMatch1+","+isMatch2+","+isMatch3);

替换的示例,如下:

public static void replaceEnd() {
    String test = "123.456.789....";
    //替换掉末尾的点号
    //[.]表示匹配符号点. 而+号表示至少一个,$表示末尾位置。如果去掉了$,那么所有的点号都会被替换掉。
    String result = test.replaceAll("[.]+$", "");
    //结果为123.456.789
    System.out.println(result);
}

\d
由于元字符一般会放在字符串中,所以需要转义,也就是\会变成 \\ ,而\d在字符串中会变成\\d。

\d表示一个整数,\d{4}表示4个整数,\d+表示任意个整数。\D+表示任意个非整数

\d{4}-\d{2}-\d{2}表示年月日,比如2016-05-05 。

匹配示例如下:

String str="2016-05-05";
String regex="\\d{4}-\\d{2}-\\d{2}"
if (str.matches(regex)){
    System.out.println(true);
}

替换示例如下:

String test="123abc45def";
//替换掉所有数字
String result=test.replaceAll("\\d","");
//结果为替换后的结果为 "abcdef"
System.out.println(result);

\s

\s表示一个空白字符(如空格、制表符、换页符等等),\s+表示任意多的空白字符。

String regex="\\s"

\S

\S表示任何一个非空白字符。\S+表示任意多的非空白字符。

String regex="\\S"

\p

\p{Upper}{2}表示2个大写字母。\p{Lower}{3}表示3个小写字母。

String regex="\\p{Upper}{2}\\p{Lower}{3}\\d{4}"

\w
\w 匹配字母或数字或下划线或汉字
\W
\W 不匹配字母或数字或下划线或汉字

匹配/替换特殊字符:

在正则表达式中,想要匹配+[.?^{|\这些特殊字符,需要在前面加上一个\ 。

比如通过 \. 去匹配.号,用\\\\去匹配\。

当然,也可以直接放到中括号里面,比如[.]就相当于"\\."

简单的替换特殊字符,如下:

    public static void replaceStr() {
        String test="123\\456.789";
        String result = test.replaceAll("\\\\", "").replaceAll("\\.", "");
        //结果为123456789
        System.out.println(result);
    }

正则表达式中包含特殊字符的示例,如下:

    public static void replaceStr() {
        String test="123$456\\$789$123";
        //替换所有的$,但是不替换\$
        //"[^\\\\]\\$",中括号内的^表示非,而\\\\表示特殊字符\,[$]表示符号$
        System.out.println(test.replaceAll("[^\\\\][$]",""));
        //结果为 12456\$78123
    }

前瞻,后顾,负前瞻,负后顾

A(?=B) 前瞻(Look ahead positive):

匹配的是A,限制条件是A的后面是B,即AB。
(?<=B)A 后顾(Look behind positive ):

匹配表达式A,限制条件A的前面是B,即BA
A(?!B) 负前瞻(Look ahead negative):

顾名思义,该正则匹配A,限制条件是A后面不是B
(?<!B)A 负后顾(Look behind negative ) :
匹配表达式A,限制条件是A的前面不是B

常用正则表达式

  • 字母:
[A-Za-z]
  • 中文:
\u4e00-\u9fa5
  • 全角字符:
\uFF00-\uFFFF
  • 正数或者小数,第一位不为零。
[1-9]+[0-9]*([.][0-9]+)?
  • 以某个字符串开始,另一个字符串结束的正则表达式。
开始字符串.+.结束字符串

参考资料:

https://www.runoob.com/regexp/regexp-syntax.html
读懂正则表达式
常用正则表达式大全
简单学习正则表达式

posted on 2020-02-01 22:56  乐之者v  阅读(485)  评论(0编辑  收藏  举报

导航