目录

一、概念

1.1 matches()

1.2 replaceAll()

1.3 split()

二、Pattern/Matcher模式

三、基本语法

四、常用组合

五、参考文献


一、概念

正则表达式定义了字符串的模式,它可以用来搜索、编辑或处理文本,简单来说,正则表达式是帮助我们根据特定格式验证或匹配字符串的方式。

在java中的字符串类涉及到正则表达的常用方法有:

1.1 matches()

该方法用来对字符串进行正则匹配。

public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}

比如,返回结果为true。\\d代表匹配数字0-9,{5}代表字符个数为5

public static void main(String[] args) {

    String value = "12345";

    System.out.println(value.matches("\\d{5}"));

}

1.2 replaceAll()

public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

该方法用于对指定表达式进行替换

public static void main(String[] args) {
    String s = "1324.5421";
    String s1 = s.replaceAll("[0-4]{4}\\.\\w{4}", "!");
    System.out.println(s1);//输出!
}

1.3 split()

public String[] split(String regex) {
    return split(regex, 0);
}

该方法用于按指定表达式分割字符串

public static void main(String[] args) {
    String s = "1324.5421";
    String[] split = s.split("\\.");//分割后数组为[1324,5421]
}

二、Pattern/Matcher模式

字符串中的调用的matches的核心还是java.util.regex包内的工具。java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher。Pattern是一个正则表达式经编译后的表现模式。 Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。

可以使用模式Pattern/Matcher匹配字符串,一个例子是:

public static void main(String[] args) {

    String value = "12345";

    String regex = "\\d{5}";

    Pattern pattern = Pattern.compile(regex);

    Matcher matcher = pattern.matcher(value);

    System.out.println("The Result is: " + matcher.matches());

}

或者直接用静态方法:

public static void main(String[] args) {
    String value = "12345";
    String regex = "\\d{5}";
    boolean matches = Pattern.matches(regex, value);
    System.out.println("The Result is: " + matches);
}

Matcher类的matches()、lookAt()和find()的区别:

1、matcher():只有在整个字符串完全匹配才返回true,否则返回false。但是如果部分匹配成功,匹配的位置将移动到下次匹配的位置

public static void main(String[] args) {
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher("22bb23");
    System.out.println(m.matches());//false
    Matcher m1 = p.matcher("221123");
    System.out.println(m1.matches());//true
}

2、lookingAt():每次都是从第一个字符开始匹配,无论匹配成功与否,都不会再继续向下匹配

public static void main(String[] args) {
        //lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("22bb23");
        m.lookingAt();//返回true,因为\d+匹配到了前面的22
        Matcher m2 = p.matcher("aa2223");
        m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
    }

3、find():部分匹配,如果匹配成功,返回true,匹配的位置移动到下次匹配的位置。

public static void main(String[] args) {
        //lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("22bb23");
        m.lookingAt();//返回true,因为\d+匹配到了前面的22
        Matcher m2 = p.matcher("aa2223");
        m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
    }

三、基本语法

1. 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。

2. []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。

3. -在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。

4. ^在中括号里面和外面含义不同,如在外时,就表示开头,如^7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[^abc]表示匹配出去abc之外的其他任一字符。

5. .表示匹配任意的字符。

6. \d表示数字。

7. \D表示非数字。

8. \s表示由空字符组成,[ \t\n\r\x\f]。

9. \S表示由非空字符组成,[^\s]。

10. \w表示字母、数字、下划线,[a-zA-Z0-9_]。

11. \W表示不是由字母、数字、下划线组成。

12. ?: 表示出现0次或1次。

13. +表示出现1次或多次。

14. *表示出现0次、1次或多次。

15. {n}表示出现n次。

16. {n,m}表示出现n~m次。

17. {n,}表示出现n次或n次以上。

18. XY表示X后面跟着Y,这里X和Y分别是正则表达式的一部分。

19. X|Y表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f。

20. (X)子表达式,将X看做是一个整体。

四、常用组合

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

sql语句:^(select|drop|delete|create|update|insert).*$

非负整数:^\d+$

正整数:^[0-9]*[1-9][0-9]*$

非正整数:^((-\d+)|(0+))$

负整数:^-[0-9]*[1-9][0-9]*$

整数:^-?\d+$

非负浮点数:^\d+(\.\d+)?$

正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$

负浮点数:^(-((正浮点数正则式)))$

英文字符串:^[A-Za-z]+$

英文大写串:^[A-Z]+$

英文小写串:^[a-z]+$

英文字符数字串:^[A-Za-z0-9]+$

英数字加下划线串:^\w+$

E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$

URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$ 或者:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~@[\]\':+!]*([^<>\"\"])*$

邮政编码:^[1-9]\d{5}$

中文:^[\u0391-\uFFE5]+$

电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$

手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$

双字节字符(包括汉字在内):^\x00-\xff

匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)

匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/>

匹配空行:\n[\s| ]*\r

提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?

提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?

提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)

提取信息中的中国手机号码:(86)*0*13\d{9}

提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}

提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}

提取信息中的中国邮政编码:[1-9]{1}(\d+){5}

提取信息中的浮点数(即小数):(-?\d*)\.?\d+

提取信息中的任何数字 :(-?\d*)(\.\d+)?

IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)

电话区号:/^0\d{2,3}$/

腾讯QQ号:^[1-9]*[1-9][0-9]*$

帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

五、参考文献

[1] Java正则表达式(一看就懂) Java正则表达式(一看就懂)

[2] Java 正则表达式 Java 正则表达式 | 菜鸟教程

[3] 给JAVA程序员的正则表达式入门课给JAVA程序员的正则表达式入门课 - 腾讯云开发者社区-腾讯云

[4] java正则表达式的语法详解及常用方法java正则表达式的语法详解及常用方法

[5] Java中正则Matcher类的matches()、lookAt()和find()的区别Java中正则Matcher类的matches()、lookAt()和find()的区别_

[6] Java中的正则表达式Java中的正则表达式