一、简介
正则表达式(Regular Expression,简称regex或RE),是一种用于匹配字符串的强大工具,它可以用来检查一个字符串是否符合某种模式,或者从某个字符串中提取符合特定模式的子串,在Java中,正则表达式主要通过java.util.regex包中的Pattern和Matcher类来实现。
二、基本语法
1、字符集
字符集是用来描述正则表达式中可能出现的字符的元字符,常见的字符集有:
- .
:表示任意字符(除了换行符)
- \w
:表示字母、数字或下划线
- \W
:表示非字母、非数字和非下划线的字符
- \d
:表示数字
- \D
:表示非数字
- s
:表示空白字符(空格、制表符、换行符等)
- \S
:表示非空白字符
- [abc]
:表示字符a、b或c
- [^abc]
:表示非字符a、b或c
- [a-z]
:表示小写字母a到z
- [A-Z]
:表示大写字母A到Z
- [0-9]
:表示数字0到9
- [^0-9]
:表示非数字0到9
2、量词
量词用来描述字符出现的次数,常见的量词有:
- </code>:表示前面的字符可以出现0次或多次
- +
:表示前面的字符可以出现1次或多次
- ?
:表示前面的字符可以出现0次或1次
- {n}
:表示前面的字符必须出现n次
- {n,}
:表示前面的字符至少出现n次
- {n,m}
:表示前面的字符至少出现n次,最多出现m次
3、边界
边界用来描述字符的位置关系,常见的边界有:
- ^
:表示字符串的开头
- $
:表示字符串的结尾
- \b
:表示单词的边界(即字母、数字或下划线与非字母、非数字和非下划线之间的边界)
- :表示单词内部(即字母、数字或下划线之间的边界)
4、分组与捕获
分组是将多个字符组合成一个整体,以便对它们进行操作,捕获是从匹配的字符串中提取子串,常见的分组与捕获符号有:
- ()
:表示分组,括号内的内容会被作为一个整体进行处理
- (?:)
:表示非捕获分组,括号内的内容不会被捕获,但会保留匹配结果,以便后续使用
- (?<name>)
:表示命名捕获,为捕获的内容指定一个名称,以便后续使用
- (?P<name>)
:与命名捕获相同,但使用的是Perl风格的命名方式
- (?=)
:表示正向前瞻,用于匹配后面跟着某个模式的位置,但不捕获匹配的内容
- (?!)
:表示负向前瞻,用于匹配后面不跟着某个模式的位置,但不捕获匹配的内容
三、实战应用
1、验证邮箱地址格式
import java.util.regex.Matcher; import java.util.regex.Pattern; public class EmailValidator { public static void main(String[] args) { String email = "example@example.com"; String regex = "^[\\w\\._%+-]+@[\w\\.-]+\\.[\\w\\.]{2,}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(email); if (matcher.matches()) { System.out.println("邮箱地址格式正确"); } else { System.out.println("邮箱地址格式错误"); } } }
2、提取URL中的域名和路径
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Group; public class URLParser { public static void main(String[] args) { String url = "https://www.example.com/path/to/page?query=param"; String regex = "^(https?://)?([\w\\.-]+)(/[\\w\\.-]+)*(\\??[\\w=&]+(&[\\w=&]+)*)?$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(url); if (matcher.matches()) { Group domainGroup = matcher.group(2); // 域名部分,如www.example.com Group pathGroup = matcher.group(3); // 路径部分,如/path/to/page?query=param,如果没有路径则为null或空字符串 System.out.println("域名:" + domainGroup); System.out.println("路径:" + pathGroup); } else { System.out.println("URL格式错误"); } } }
3、验证手机号码格式(中国大陆)
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Group; import java.util.Locale; import java.text.NumberFormat; import java.text.ParseException; import java.util.Currency; import java.util.CurrencyUnit; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.format.DateTimeFormatter; import java.time.*; import java.time.*; // for date and time classes, e.g LocalDate, LocalTime, etc... // import other necessary libraries here... // ... public class Main { public static void main(String[] args) { // your code here... System.out
还没有评论,来说两句吧...