正则表达式(Regular Expresssion)
用于文本的复杂处理
使用流程:
- 分析所要匹配的数据,写出测试用的典型数据
- 在工具软件中进行匹配测试
- 在程序中调用通过测试的正则表达式
语法:
标准字符集合
--能够与“多种字符”匹配的表达式
--注意区分大小写,大写是相反的意思
\d :任意一个数字 ,0-9中的任意一个
\w :任意一个字母或数字或下划线,也就是A-Z,a-z,0-9,中任意一个
\s :包括空格、制表符、换行符等空白字符的其中任意一个
. :小数点可以匹配任意一个字符(除换行符),如要匹配包括“\n”在内所有字符,一般用\s\S
自定义字符集合
[] :匹配“a”或“b”或“5”或“@”
[^abc] :匹配“a”“b”“c”之外的任意一个字符
[f-k] :匹配“f”~“k”之间的任意一个字母
[^A-F0-3] :匹配“A”~“F”,“0”~“3”之外的任意一个字符
量词(Quantifier):修饰匹配次数的特殊符号
--贪婪模式 : 默认匹配越多越好
--非贪婪模式 :在量词后面加上? ,表示匹配越少越好
{n} :表达式重复n次
{m,n} :表达式至少重复m次,最多重复n次
{m,} :表达式至少重复m次
? :匹配表达式0次或者1次,相当于{0,1}
+ :表达式至少出现1次,相当于{1,}
* :表达式不出现或出现任意次,相当于{0,}
字符边界:“零宽”的匹配
--匹配的不是字符而是位置,复合某种条件的位置
^ :与字符串开始的地方匹配
$ :与字符串结束的地方匹配
\b :匹配一个单词边界 相当于不全是\w
选择符和分组
-- | 分支结构:左右两边表达式之间“或”关系,匹配左边或者右边
--()捕获组:1.在被修饰匹配次数的时候,括号中的表达式可以作为调整被修饰
2.取匹配结果的时候,括号中表达式匹配到的内容可以被单独得到
3.每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。
--(?:Expression)非捕获组:一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用
反向引用(\nnn)
--每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号
--通过反引用,可以对分组已捕获的字符串进行引用
预搜索(零宽断言)
(?=exp):断言自身出现的位置后面能匹配表达式exp
(?<=exp):断言自身出现的位置的前面能匹配表达式exp
(?!exp):断言此位置的后面不能匹配表达式exp
(?<!exp):断言此位置的前面不能匹配表达式exp
public class Demo01 { public static void main(String[] args) { //在这个字符串:asfsdf23323,是否符合指定正则表达式:\w+ //表达式对象 Pattern p = Pattern.compile("\\w+"); //创建Matcher对象 Matcher m = p.matcher("asfsdf2&&3323"); // boolean b = m.matches();//尝试将整个字符序列与该模式匹配 // System.out.println(b); // boolean b2 = m.find();//该方法扫描输入的序列,查找与该模式匹配的下一个子序列 // System.out.println(b2); while(m.find()) { System.out.println(m.group()); System.out.println(m.group(0));//group(),group(0)匹配整个表达式的子字符串 } } }
测试正则表达式对象的基本用法
public class Demo02 { public static void main(String[] args) { //在这个字符串:asfsdf23323,是否符合指定的正则表达式:\w+ //表达式对象 Pattern p = Pattern.compile("([a-z]+)([0-9]+)"); //创建Matcher对象 Matcher m = p.matcher("aa232**ssd445*sds223"); while(m.find()) { System.out.println(m.group()); System.out.println(m.group(1)); System.out.println(m.group(2)); } } }
分组处理
public class Demo03 { public static void main(String[] args) { //表达式对象 Pattern p = Pattern.compile("[0-9]"); //创建Matcher对象 Matcher m = p.matcher("aa232**ssd445*sds223"); //替换 String str = m.replaceAll("#"); System.out.println(str); } }
替换操作
public class Demo04 { public static void main(String[] args) { String str = "a6548942bv31543s31"; String[] arrs = str.split("\\d+"); System.out.println(Arrays.toString(arrs)); } }
分割字符串的操作