正则表达式
正则表达式是用于操作字符串的一个规则,正则表达式的规则使用了特殊的符号表示。
一、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字:[^0-9] 除了0-9,其他都匹配 \s 空白字符:[ \t\n\x0B\f\r]\S 非空白字符:[^\s]\w 单词字符:[a-zA-Z_0-9] 包括a-z,A-Z,_,0-9\W 非单词字符:[^\w]
注意:任何预定义字符没有加上数量词之前都只能匹配一个字符而已。
public class MyRegex { public static void main(String[] args) { System.out.println("任意字符:"+("%".matches(".")));//true System.out.println("数字字符:"+("1".matches("\\d")));//true System.out.println("非数字字符:"+("@".matches("\\D")));//true System.out.println("空白字符:"+("").matches("\\s"));//false System.out.println("空白字符:"+(" ").matches("\\s"));//true System.out.println("空白字符:"+("\r").matches("\\s"));//true System.out.println("非空白字符:"+("a").matches("\\S"));//true System.out.println("非空白字符:"+("\n").matches("\\S"));//false System.out.println("单词字符:"+("_").matches("\\w"));//true System.out.println("单词字符:"+("#").matches("\\w"));//false System.out.println("非单词字符:"+("_").matches("\\W"));//false System.out.println("非单词字符:"+("#").matches("\\W"));//true System.out.println(""); System.out.println(""); System.out.println(""); } }
二、数量词
X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好n次 X{n,} X,至少n次 X{n,m} X,至少n次,但是不超过m次
Demo:
public class MyRegex { public static void main(String[] args) { System.out.println("? 一次或一次也没有:"+("12".matches("\\d?")));//false System.out.println("* 零次或多次:"+("123".matches("\\d*")));//true System.out.println("+ 至少出现一次:"+("1".matches("\\d+")));//true System.out.println("{次数} 恰好出现n次:"+("12345678911".matches("\\d{11}")));//true System.out.println("{次数,} 至少要出现指定的次数:"+("123".matches("\\d{3,}")));//true System.out.println("{次数1,次数2} 指定出现次数的范围:"+("1234".matches("\\d{3,4}")));//true } }
三、字符类
[abc] a、b或c(简单类)[^abc] 任何字符,除了a、b或c(否定)[a-zA-Z] a到z或A到Z,两头的字母包括在内(范围)[a-d[m-p]] a到d或m到p:[a-dm-p](并集) 或直接写 [a-dm-p][a-z&&[def]] d、e或f(交集) 或直接写 [def]
注意:范围词里面不管内容多长,没有数量词的配合都只能匹配一个字符而已。
public class MyRegex { public static void main(String[] args) { System.out.println("d".matches("[abc]"));//false System.out.println("abc".matches("[abc]{3}"));//true 要匹配三个,必须加数量词 System.out.println("%".matches("[^abc]"));//true System.out.println("字符可以是a-z之间:"+("a".matches("[a-z]")));//true System.out.println("字符可以是a-z、$、#之一:"+("a".matches("[a-zA-Z$#]")));//true } }
需求:根据叠词进行切割字符串
public class Demo5 { public static void main(String[] args) { testSplit(); } /* * 根据叠词进行切割 */ public static void testSplit() { String str = "大家家家明天天玩得得得得开心"; //如果正则的内容需要被复用,那么需要对正则的内容进行分组。 //分组的目的就是为了提高正则的复用性。组号不能指定,从1开始。 String[] datas = str.split("(.)\\1+"); System.out.println("数组的元素是:"+Arrays.toString(datas)); //数组的元素是:[大, 明, 玩, 开心] } }
():分组,分组的目的是为了让正则的内容被复用起来,组号从1开始。
((A)(B(C))):
第一组:((A)(B(C)))
第二组:(A)
第三组:(B(C))
第四组:(C)
package mydemo;import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class Demo5 { public static void main(String[] args) { testSplit(); replaceTest(); } /* * 根据叠词进行切割 */ public static void testSplit() { String str = "大家家家明天天玩得得得得开心"; //如果正则的内容需要被复用,那么需要对正则的内容进行分组。 //分组的目的就是为了提高正则的复用性。组号不能指定,从1开始。 String[] datas = str.split("(.)\\1+"); System.out.println("数组的元素是:"+Arrays.toString(datas)); //数组的元素是:[大, 明, 玩, 开心] } /** * 替换 */ public static void replaceTest() { //还原为: 我要学编程 String str = "我我我我我要要要学学编编编程程程"; //如果需要在replaceAll方法正则的外部引用组内容,使用“$组号” str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str);//我要学编程 } }
四、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
注意:\b 单词边界匹配器只是代表了单词的开始或者结束部分,不匹配任何的字符。
public class Demo6 { public static void main(String[] args) { System.out.println("hello world".matches("hello\\bworld"));//false System.out.println("hello world".matches("hello\\b world"));//true System.out.println("hello,world".matches("hello\\b,world"));//true //任何一个可以分割字符的符号都可以表示单词的结束 } }
五、正则对象
查找:
指定字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的正则对象匹配任意的字符串用于创建Matcher对象,执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
Pattern p = Pattern.compile("正则"); Matcher m = p.matcher("abc");boolean b = m.matches();
1.Pattern(正则对象)
2.Matcher(匹配器对象)
匹配器使用的方法:
find():通知匹配器去匹配字符串,查找符合规则的字符串;找到返回true,否则返回false
group():获取符合规则的子串。
注意:使用group方法一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错。
import java.util.regex.Matcher;import java.util.regex.Pattern;public class Demo7 { public static void main(String[] args) { //找出三个字母组成的单词 String content = "wo shi yi ming cai niao xian zai zai nu li bian hao"; String reg = "\\b[a-zA-Z]{3}\\b"; //先把字符串的正则编译成Pattern对象 Pattern p = Pattern.compile(reg); //使用正则对象匹配字符串用于生产一个Matcher对象 Matcher m = p.matcher(content); while(m.find()) { System.out.println(m.group()); /* * shi cai zai zai hao */ } } }
作者:JS_HCX
链接:https://www.jianshu.com/p/cc4724051eb0