Java的Regex --正则表达式
一、概述
正则表达式通常被用来对字符串提供范围性的校验、替换那些符合某个模式(规则)的文本。
正则表达式所对应的类Pattern,所有的正则表达式都是在这个类下创建的。Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。
完成使用方法如下:
String str = "abc"; //指定校验格式 Pattern p = Pattern.compile("abc"); //将当前的规则和判断字符串进行匹配 Matcher m = p.matcher(str); //进行判断 boolean b = m.matches(); System.out.println(b);
二、正则表达式常用符号介绍
1、[ ] 表示匹配括号中的任意一个字符。比如:
[a - z ]:表示匹配任意一个小写字母。
2、^字符:如果用在[ ]内表示非;如果^放在了整个表达式的开头,表示强制以当前字符开头。比如:
[^a-z]:表示除了小写字母以外的字符;^[a-z]则表示以小写字母开头。
3、预定义符号:
- .:表示任意字符;
- \w:表示单词字符 [a-zA-Z_0-9]
- \d:表示数字[0-9];
- \s:表示空白字符:[ \t\n\x0B\f\r];
- \D:表示非数字: [^0-9]
- \W:表示非单词字符:[^\w]
- \S:表示非空白字符:[^\s]
示例如下:
public static void main(String[] args) { String str = "\\\\"; //1. 字符串是由3个字符组成:第一个字符只能从a/b/c,第二个字符只能由r/s/t // 第三个字符是数字 // [xyz] - 表示可以是x/y/z中的任何一个 // [a-b] - 按照码表从a开始一直找到b //System.out.println(str.matches("[abc][rst][0-9]")); // 1.判断一个字符串是否是由一个小写字母组成 // System.out.println(str.matches("[a-z]")); // 2. [^abc]表示除了a/b/c // System.out.println(str.matches("[^a-zA-Z]")); //3. 字符串由三个组成,第一个是字母,第二个是数字, //“.”表示任意一个字符 //System.out.println(str.matches("[a-zA-Z][0-9].")); //4.判断字符串是否只有一个字符 //System.out.println(str.matches(".")); //匹配. //\\. 经过java编译就变成了\.,正则再转义成. 表示. //System.out.println(str.matches("\\.")); //\\\\java编译\\;\\正则编译后\ // \\\\ -> \\ -> \ //System.out.println(str.matches("\\\\")); System.out.println(str.matches("\\w")); System.out.println(str); }
4、数量词:
- +:表示1次到多次 {1,};
- *:表示0次多到次 {0,};
- ?:表示0次到一次 {0,1};
- {n}:表示有且只有n次;
- {n,}:表示n次及其以上;
- {n,m}表示n-m次之间。
示例如下:
public static void main(String[] args) { String str = "dasfd"; //1. {5}恰好由n次 System.out.println(str.matches("[a-zA-Z]{5}")); //2. 至少由5个字母组成的字符串 //System.out.println(str.matches("[a-zA-Z]{4}[a-zA-Z]+")); System.out.println(str.matches("[a-zA-Z]{5,}")); //3.由6-12个字符组成 System.out.println(str.matches(".{6,12}")); }
二、捕获组
捕获组的特征:
1、用()括起来的单元称之为捕获组;
2、在正则表达式中,会对捕获组进行自动编号,编号从1开始。这与大多数的编号从0开始不同。
3、\n表示引用编号为n的捕获组;
4、捕获组的编号从(左括号的出现位置开始依次计数。
捕获组往往用于叠字的判断,示例如下:
//{2,} -- 至少两个字符 //(.)\\1+ 表示叠字 String str1 = "娃哈哈"; System.out.println(str1.matches(".*(.)\\1+.*")); //AABB 高高兴兴 String str2 = "高高兴兴"; System.out.println(str2.matches(".*(.)\\1(.)\\2.*")); //abab 休息休息 (..)任意两个字符 String str3 = "休息休息"; System.out.println(str3.matches("(..)\\1"));
三、正则表达式和String结合后的使用
使用Pattern和Matcher的方式匹配太过繁琐,我们往往使用字符串直接匹配的方法进行判断。
1、字符替换
将String字符串中的字符进行替换,返回一个新的字符,原字符串不变。例如:
String str = "asfsafasf12sad17--"; //将字符串替换为-- System.out.println(str.replaceAll("\\d", "-")); //将字符串中的所有的数字去掉;参数:正则表达式 System.out.println(str.replaceAll("\\d", "")); //所有非数字替换掉 System.out.println(str.replaceAll("\\D", "")); String sub = str.replaceAll("\\D", "");
2、对字符串进行切割
以某字符或数字作为切割符将字符串进行切割成多个子串,返回一个子串数组。例如:
//切割 String str = "40asfas40as1fasdcer4"; //以数字为切割符将字符串切割成多个子串 //作为切割符的字符会被整个切掉 //如果切割符在字符串的尾部,会被直接切掉 String[] arr = str.split("\\d"); System.out.println(arr.length); for(String s : arr) { System.out.println(s); }
3、使用$引用上一个捕获组,对字符串进行去重和颠倒
将字符串中的多个连续的字符去掉,或者将单词进行颠倒。比如:
String str = "Cat Dog"; //将cat和dog的位置进行颠倒 //在替换过程中,\n的形式不起作用 //在替换过程中,如果想要引用上一个捕获组,那么需要使用$n的形式 System.out.println(str.replaceAll("(Cat)(.*)(Dog)", "$3$2$1")); String str1 = "我我我我爱爱学学学学习习"; System.out.println(str1.replaceAll("(.)\\1+", "$1"));