基础
正则表达式可以用来对符合某些特征的字符串进行检索、选择、编辑、验证。它的适用性非常广泛,许多编程语言都在语言级别或者类库中提供对正则表达式的支持,除此之外许多文本检索工具都支持使用正则表达式,我们在使用git进行过滤文件时也能看到它的身影.....
一个简单例子,试编程判断一个字符串是否全部由数字组成。
传统判断方式:
public class RegexDemo01{ public static void main(String args[]){ String str = "1234567890" ; // 此字符串由数字组成 boolean flag = true ; // 定义一个标记变量 // 要先将字符串拆分成字符数组,之后依次判断 char c[] = str.tocharArray() ; // 将字符串变为字符数组 for(int i=0;i<c.length;i++){ // 循环依次判断 if(c[i]<'0'||c[i]>'9'){ // 如果满足条件,则表示不是数字 flag = false ; // 做个标记 break ; // 程序不再向下继续执行 } } if(flag){ System.out.println("是由数字组成!") ; }else{ System.out.println("不是由数字组成!") ; } } };
采用正则表达式:
import java.util.regex.Pattern ; public class RegexDemo02{ public static void main(String args[]){ String str = "1234567890" ; // 此字符串由数字组成 if(Pattern.compile("[0-9]+").matcher(str).matches()){ // 使用正则 System.out.println("是由数字组成!") ; }else{ System.out.println("不是由数字组成!") ; } } };
正则表达式的基本语法
B | 指定字符B |
\xhh | 十六进制值为oxhh的字符 |
\uhhh | 十六进制表示为oxhhh的unicode字符 |
\t | 制表符Tab |
\n | 换行符 |
\r | 回车 |
\f | 换页 |
\e | 转义(Escape) |
[abc] | 包含a、b和c的任何字符(和a|b|c作用相同) |
[^abc] | 除了a、b和c之外的任何字符(否定) |
[a-zA-Z] | 从a到z或从A到Z的任何字符(范围) |
[abc[hij]] | 任意a、b、c、h、i、j字符 |
\s | 空白符(空格、tab、换行、换页和回车) |
\S | 非空白符( [^\s] ) |
\d | 数字[0-9] |
\D | 非数字[^0-9] |
\w | 词字符[a-zA-Z0-9] |
\W | 非词字符[^\w] |
. | 匹配除换行以外的任意字符 |
提醒: 在java的正则表达式中,除了换行和制表符之类的东西只需要直接使用单反斜线 :\n\t 之外,其他在遇到 \ 的时候,需要对其进行转义,比如在使用\d 时就必须要使用\\d,在遇到其他一些歧义的时候,也需要进行转义,例如插入一个普通的反斜线,应该使用\\\\ ,插入一个 | ,则需要使用 \\| 。
怎么表示任意字符呢 ?
既然\s表示空白字符,\S表示非空白符,那么[\s\S] 便能表示一个任意字符,[\s\S]* 便能表示任意一个字符串。
类似的,[\d\D]、[\w\W]、[.\n]都可以起到同样的作用。
XY | Y跟在X后面 |
X|Y | X或Y |
(X) | 捕获组 |
^ | 一行的起始 |
$ | 一行的结束 |
\b | 词的边界 |
\B | 非词的边界 |
\G | 前一个匹配的结束 |
X? | 一个或零个X |
X* | 零个或一个或多个X |
X+ | 一个或者多个X |
X{n} | 恰好n次X |
X{n,} | 至少n次X |
X{n,m} | X至少n次,且不超过m次 |
Pattern、Matcher类
这两个类是正则操作的核心类,都定义在java.util.regex包中。Pattern主要进行正则规范的编写,Matcher类主要用来执行规范,验证一个字符串是否符合其规范。
Pattern的常用方法:
方法 | 描述 |
public static Pattern complie(String regex) | 返回正则表达式规则 |
public Matcher matcher(CharSequence input) | 取得Matcher实例 |
public String[] split(CharSequence input) | 字符串拆分 |
Matcher类的常用方法:
方法 | 描述 |
public boolean matches() | 执行验证 |
public String replaceAll(String replacement) | 字符串替换 |
使用例:
public class RegexDemo03{ public static void main(String args[]){ String str = "1983-07-27" ; // 指定好一个日期格式的字符串 String pat = "\\d{4}-\\d{2}-\\d{2}" ; // 指定好正则表达式 Pattern p = Pattern.compile(pat) ; // 实例化Pattern类 Matcher m = p.matcher(str) ; // 实例化Matcher类 if(m.matches()){ // 进行验证的匹配,使用正则 System.out.println("日期格式合法!") ; }else{ System.out.println("日期格式不合法!") ; } } };
String类对正则的支持
日常中,一般使用String中提供的正则支持,而很少使用Pattern和Matcher类。
方法 | 描述 |
public boolean matches(String regex) | 字符串匹配 |
public String replaceAll(String regex,String replacement) | 字符串替换 |
public String[] split(String regex) | 字符串拆分 |
例:
public class RegexDemo06{ public static void main(String args[]){ String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ; boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ; String s[] = "A1B22C333D4444E55555F".split("\\d+") ; System.out.println("字符串替换操作:" + str1) ; System.out.println("字符串验证:" + temp) ; System.out.print("字符串的拆分:") ; for(int x=0;x<s.length;x++){ System.out.print(s[x] + "\t") ; } } };