java 正则表达式
1. 正则表达式生成网站:
2. 正则表达式介绍
package com.ggh.study; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexStudy { public static void main(String[] args) { /*正则相关类及方法*/ //正则对象 Pattern pattern = Pattern.compile("[a]"); //入参:正则表达式 //匹配器对象 Matcher matcher = pattern.matcher("abcabc"); //入参:需要处理的字符串 // 判断"abcabc"是否与正则表达式"[a]"描述相同 boolean b1 = matcher.matches(); // 判断"abcabc"中是否含有符合正则表达式"[a]"描述的子串,如果找到符合条件的子串就返回true并保存找到的子串的起始和结束下标,当再次调用时会从保存的下标处继续往下查找 boolean b2 = matcher.find(); // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串可以通过group(0)返回,如果需要得到所有符合条件的子串则需要循环执行find()和group(0) String group = matcher.group(0); // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串的起始下标可以通过start()返回,如果需要得到所有符合条件的子串的起始下标则需要反复执行find()和start() int startIndex = matcher.start(); // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串的结束下标可以通过end()-1返回,如果需要得到所有符合条件的子串的结束下标则需要反复执行find()和end()-1 int endIndex = matcher.end() - 1; // 返回将"abcabc"中所有符合正则表达式"[a]"描述的子串替换成"A"的新字符串,并不会改变原有字符串只会获取一个新的字符串 String newStr = matcher.replaceAll("A"); //newStr=="AbcAbc" /*正则表达式 jdk1.8.0_202 */ System.out.println("<以下是在jdk1.8.0_202下运行的结果>"); //[] String regexStr1 = "[a]"; //[a] <==> a [a][b] <==> ab String content1 = "abac"; Pattern pattern1 = Pattern.compile(regexStr1); Matcher matcher1 = pattern1.matcher(content1); System.out.println("测试[]的结果:--------------------"); while (matcher1.find()) { System.out.println(matcher1.group()); } //{}描述字符数量 注.一个{}只能描述一个单位([a][b]{2}的含义:{2}仅描述[b]不描述[a] ([a][b]){2}的含义:匹配"abab") // {}使用方式1 String regexStr2 = "[a]{2}"; //[a]{2} <==> a{2} <==> aa [b]{1}[a]{2} ==> ba{2} ==> baa String content2 = "aabbaababc"; Pattern pattern2 = Pattern.compile(regexStr2); Matcher matcher2 = pattern2.matcher(content2); System.out.println("测试{}使用方式1的结果:--------------------"); while (matcher2.find()) { System.out.println(matcher2.group()); } // {}使用方式2 String regexStr3 = "[a]{2,4}"; //表示字符串"aaaa"或"aaa"或"aa" 注.会贪心匹配 String content3 = "abaaac"; Pattern pattern3 = Pattern.compile(regexStr3); Matcher matcher3 = pattern3.matcher(content3); System.out.println("测试{}使用方式2的结果:--------------------"); while (matcher3.find()) { System.out.println(matcher3.group()); } // {}使用方式3 String regexStr4 = "[a]{2,}"; //表示只有至少连续两个a的字符串 注.会贪心匹配 String content4 = "abaaac"; Pattern pattern4 = Pattern.compile(regexStr4); Matcher matcher4 = pattern4.matcher(content4); System.out.println("测试{}使用方式3的结果:--------------------"); while (matcher4.find()) { System.out.println(matcher4.group()); } //+表示字符数量至少为1 注.一个+只能描述一个单位 // +使用方式1 String regexStr5 = "[a]+"; //表示只有至少连续一个a的字符串 [b][a]+ <==> ba+ 注.会贪心匹配 String content5= "abaaac"; Pattern pattern5 = Pattern.compile(regexStr5); Matcher matcher5 = pattern5.matcher(content5); System.out.println("测试+使用方式1的结果:--------------------"); while (matcher5.find()) { System.out.println(matcher5.group()); } // +使用方式2 String regexStr6 = "[a+]"; //表示字符串"a"或者"+" String content6= "abaaa+c"; Pattern pattern6 = Pattern.compile(regexStr6); Matcher matcher6 = pattern6.matcher(content6); System.out.println("测试+使用方式2的结果:--------------------"); while (matcher6.find()) { System.out.println(matcher6.group()); } //*表示字符数量为任意个(包含0个) 注.一个*只能描述一个单位 // *使用方式1 String regexStr7 = "b[a]*"; //表示只有一个b且之后紧跟连续任意个(包含0个)a的字符串 注.会贪心匹配 String content7= "abaaac"; Pattern pattern7 = Pattern.compile(regexStr7); Matcher matcher7 = pattern7.matcher(content7); System.out.println("测试*使用方式1的结果:--------------------"); while (matcher7.find()) { System.out.println(matcher7.group()); } // *使用方式2 String regexStr8 = "[a*]"; //表示字符串"a"或者"*" String content8 = "abaaa*c"; Pattern pattern8 = Pattern.compile(regexStr8); Matcher matcher8 = pattern8.matcher(content8); System.out.println("测试*使用方式2的结果:--------------------"); while (matcher8.find()) { System.out.println(matcher8.group()); } //?表示字符数量最多为1(0或1) 注.一个?只能描述一个单位 // ?使用方式1 String regexStr9 = "b[a]?"; //表示只有一个b且之后紧跟一个或零个a的字符串 注.会贪心匹配 String content9 = "abaaac"; Pattern pattern9 = Pattern.compile(regexStr9); Matcher matcher9 = pattern9.matcher(content9); System.out.println("测试?使用方式1的结果:--------------------"); while (matcher9.find()) { System.out.println(matcher9.group()); } // ?使用方式2 String regexStr10 = "[a?]"; //表示字符串"a"或者"?" String content10 = "abaaa?c"; Pattern pattern10 = Pattern.compile(regexStr10); Matcher matcher10 = pattern10.matcher(content10); System.out.println("测试?使用方式2的结果:--------------------"); while (matcher10.find()) { System.out.println(matcher10.group()); } //-表示某字符到某字符之间的任意字符 // -使用方式1 String regexStr11 = "[a-c]"; //表示字符串"a"或者"b"或者"c" String content11 = "a-dc-"; Pattern pattern11 = Pattern.compile(regexStr11); Matcher matcher11 = pattern11.matcher(content11); System.out.println("测试-使用方式1的结果:--------------------"); while (matcher11.find()) { System.out.println(matcher11.group()); } // -使用方式2 String regexStr12 = "[a-]"; //表示字符串"a"或者"-" String content12 = "a-dc-"; Pattern pattern12 = Pattern.compile(regexStr12); Matcher matcher12 = pattern12.matcher(content12); System.out.println("测试-使用方式2的结果:--------------------"); while (matcher12.find()) { System.out.println(matcher12.group()); } // -使用方式3 String regexStr13 = "[a]-"; //表示只有连续连个字符且左边是a右边是-的字符串 [a]- <==> a- String content13 = "a-dc-"; Pattern pattern13 = Pattern.compile(regexStr13); Matcher matcher13 = pattern13.matcher(content13); System.out.println("测试-使用方式3的结果:--------------------"); while (matcher13.find()) { System.out.println(matcher13.group()); } //.表示任意字符 // .使用方式1 String regexStr14 = "[a]."; //表示只有连续连个字符且左边是a右边是任意字符的字符串 String content14 = "a-adc-a."; Pattern pattern14 = Pattern.compile(regexStr14); Matcher matcher14 = pattern14.matcher(content14); System.out.println("测试.使用方式1的结果:--------------------"); while (matcher14.find()) { System.out.println(matcher14.group()); } // .使用方式2 String regexStr15 = "[.]"; //表示字符串"." String content15 = "a-adc-a."; Pattern pattern15 = Pattern.compile(regexStr15); Matcher matcher15 = pattern15.matcher(content15); System.out.println("测试.使用方式2的结果:--------------------"); while (matcher15.find()) { System.out.println(matcher15.group()); } //^ 当^用在[]中时表示取反,当^用在[]外表示字符串开头 注.当^用在[]中时一个^描述多个单位 // ^使用方式1 String regexStr16 = "[^ab]"; //表示只有除了a和b字符之外的一个字符的字符串 注.当^用在[]中时要放在开头才表示取反,否则表示匹配字符^ String content16 = "abc-ab"; Pattern pattern16 = Pattern.compile(regexStr16); Matcher matcher16 = pattern16.matcher(content16); System.out.println("测试^使用方式1的结果:--------------------"); while (matcher16.find()) { System.out.println(matcher16.group()); } // ^使用方式2 String regexStr17 = "^[a]"; //表示只有开头一个a的字符串 "^[a]?[b]"表示字符串"ab"或者"b" String content17 = "abc-ab"; Pattern pattern17 = Pattern.compile(regexStr17); Matcher matcher17 = pattern17.matcher(content17); System.out.println("测试^使用方式2的结果:--------------------"); while (matcher17.find()) { System.out.println(matcher17.group()); } //$表示结尾 String regexStr18 = "[b]$"; //表示只有结尾一个b的字符串 String content18 = "abc-ab"; Pattern pattern18 = Pattern.compile(regexStr18); Matcher matcher18 = pattern18.matcher(content18); System.out.println("测试$的结果:--------------------"); while (matcher18.find()) { System.out.println(matcher18.group()); } //|表示或 注.一个|^描述多个单位 // |使用方式1 String regexStr19 = "[a][b]|[c][d]"; //表示字符串"ab"或者"cd" [a][b]|[c][d] ==> ab|cd String content19 = "ab-|cb"; Pattern pattern19 = Pattern.compile(regexStr19); Matcher matcher19 = pattern19.matcher(content19); System.out.println("测试|使用方式1的结果:--------------------"); while (matcher19.find()) { System.out.println(matcher19.group()); } // |使用方式2 String regexStr20 = "[a|b]"; //表示字符串"a"或者"|"或者"b" String content20 = "ab-|cb"; Pattern pattern20 = Pattern.compile(regexStr20); Matcher matcher20 = pattern20.matcher(content20); System.out.println("测试|使用方式2的结果:--------------------"); while (matcher20.find()) { System.out.println(matcher20.group()); } //\\b表示字符串边界 String regexStr21 = "[a]\\b"; //表示只有连续连个字符其中左边是a右边是字符串边界(开头 结尾 \n \r 空格 Tab)的字符串 "[a\\b]" ==> 正则语法错误 "[a\b]" ==> 表示字符串"a"或者"\b"(退格符) String content21 = "a1\rb-|a ca2bab"; Pattern pattern21 = Pattern.compile(regexStr21); Matcher matcher21 = pattern21.matcher(content21); System.out.println("测试\\\\b的结果:--------------------"); while (matcher21.find()) { System.out.println(matcher21.group()); } //\\B表示非字符串边界 String regexStr22 = "[a]\\B"; //表示只有连续连个字符其中左边是a右边是非字符串边界(开头 结尾 \n \r 空格 Tab)的字符串 "[a\\B]" ==> 正则语法错误 "[a\B]" ==> 正则语法错误 String content22 = "a1\rb-|a ca2bab"; Pattern pattern22 = Pattern.compile(regexStr22); Matcher matcher22 = pattern22.matcher(content22); System.out.println("测试\\\\B的结果:--------------------"); while (matcher22.find()) { System.out.println(matcher22.group()); } //\\d表示数字字符 String regexStr23 = "[a]\\d"; //表示只有连续连个字符其中左边是a右边是数字字符的字符串 "[a\\d]" ==> 表示字符串"a"或者数字字符 "[a\d]" ==> 正则语法错误 String content23 = "a1\rb-|a ca2bab" ; // Pattern pattern23 = Pattern.compile(regexStr23); Matcher matcher23 = pattern23.matcher(content23); System.out.println("测试\\\\d的结果:--------------------"); while (matcher23.find()) { System.out.println(matcher23.group()); } //\\D表示非数字字符 String regexStr24 = "[a]\\D"; //表示只有连续连个字符其中左边是a右边是非数字字符的字符串 "[a\\D]" ==> 表示字符串"a"或者非数字字符 "[a\D]" ==> 正则语法错误 String content24 = "a1\rb-|a ca2bab"; Pattern pattern24 = Pattern.compile(regexStr24); Matcher matcher24 = pattern24.matcher(content24); System.out.println("测试\\\\D的结果:--------------------"); while (matcher24.find()) { System.out.println(matcher24.group()); } //\\s表示空白字符(空格、制表符、回车符、换页符、换行符等) String regexStr25 = "[a]\\s"; //表示只有连续连个字符其中左边是a右边是空白字符 "[a\\s]" ==> 表示字符串"a"或者空白字符 "[a\s]" ==> 正则语法错误 String content25 = "a1\rb-|a ca2bab"; Pattern pattern25 = Pattern.compile(regexStr25); Matcher matcher25 = pattern25.matcher(content25); System.out.println("测试\\\\s的结果:--------------------"); while (matcher25.find()) { System.out.println(matcher25.group()); } //\\S表示非空白字符(空格、制表符、回车符、换页符、换行符等) String regexStr26 = "[a]\\S"; //表示只有连续连个字符其中左边是a右边是非空白字符 "[a\\S]" ==> 表示字符串"a"或者空白字符 "[a\S]" ==> 正则语法错误 String content26 = "a1\rb-|a ca2bab"; Pattern pattern26 = Pattern.compile(regexStr26); Matcher matcher26 = pattern26.matcher(content26); System.out.println("测试\\\\S的结果:--------------------"); while (matcher26.find()) { System.out.println(matcher26.group()); } //\\w表示数字或字符或_ String regexStr27 = "[a]\\w"; //表示只有连续连个字符其中左边是a右边是数字字符或者字母字符或者_ "[a\\w]" <==> "[aA-Za-z0-9_]" "[a\w]" ==> 正则语法错误 String content27 = "a1\rb-|a ca天bab_"; Pattern pattern27 = Pattern.compile(regexStr27); Matcher matcher27 = pattern27.matcher(content27); System.out.println("测试\\\\w的结果:--------------------"); while (matcher27.find()) { System.out.println(matcher27.group()); } //\\W表示非数字且非字符且非_ String regexStr28 = "[a]\\W"; //表示只有连续连个字符其中左边是a右边是非数字字符且非字母字符且非_ "[a\\W]" <==> "[a]|[^A-Za-z0-9_]" "[a\W]" ==> 正则语法错误 String content28 = "a1\rb-|a ca天bab_"; Pattern pattern28 = Pattern.compile(regexStr28); Matcher matcher28 = pattern28.matcher(content28); System.out.println("测试\\\\W的结果:--------------------"); while (matcher28.find()) { System.out.println(matcher28.group()); } //() // ()使用方式 String regexStr29 = "([a])([b]([c]))"; //表示字符串"abc" 当使用find()找到"abc"时,可以使用group(1)、group(2)、group(3)分别获取"abc"中的"a"、"bc"、"b" String content29 = "abcdef"; Pattern pattern29 = Pattern.compile(regexStr29); Matcher matcher29 = pattern29.matcher(content29); System.out.println("测试()使用方式的结果:--------------------"); while (matcher29.find()) { System.out.println(matcher29.group(0)); System.out.println(matcher29.group(1)); System.out.println(matcher29.group(2)); System.out.println(matcher29.group(3)); } // (?<>)使用方式 String regexStr30 = "(?<g1>[a])(?<g2>[b](?<g3>[c]))"; //表示字符串"abc" 当使用find()找到"abc"时,可以使用group("g1")、group("g2")、group("g3")分别获取"abc"中的"a"、"bc"、"b" String content30 = "abcdef"; Pattern pattern30 = Pattern.compile(regexStr30); Matcher matcher30 = pattern30.matcher(content30); System.out.println("测试(?<>)使用方式的结果:--------------------"); while (matcher30.find()) { System.out.println(matcher30.group(0)); System.out.println(matcher30.group(1)); System.out.println(matcher30.group("g1")); System.out.println(matcher30.group(2)); System.out.println(matcher30.group("g2")); System.out.println(matcher30.group(3)); System.out.println(matcher30.group("g3")); } // (?:|)使用方式 String regexStr31 = "a(?:b|cd)"; //ab|acd String content31 = "abdacd"; Pattern pattern31 = Pattern.compile(regexStr31); Matcher matcher31 = pattern31.matcher(content31); System.out.println("测试(?:|)使用方式的结果:--------------------"); while (matcher31.find()) { System.out.println(matcher31.group()); } // (?=|)使用方式 String regexStr32 = "a(?=b|cd)"; //(a)(b|cd)加上find()加上group(1) String content32 = "abdacd"; Pattern pattern32 = Pattern.compile(regexStr32); Matcher matcher32 = pattern32.matcher(content32); System.out.println("测试(?=|)使用方式的结果:--------------------"); while (matcher32.find()) { System.out.println(matcher32.group()); } // (?!|)使用方式 String regexStr33 = "a(?!b|cd)"; // 与a(?=b|cd)作用相反 String content33 = "abdacdac"; Pattern pattern33 = Pattern.compile(regexStr33); Matcher matcher33 = pattern33.matcher(content33); System.out.println("测试(?!|)使用方式的结果:--------------------"); while (matcher33.find()) { System.out.println(matcher33.group()); } // (?i)使用方式 注.一个(?i)描述多个单位 String regexStr34 = "[a](?i)[b][c]"; //表示字符串"abc"且b与c不区分大小写 String content34 = "abcaBC"; Pattern pattern34 = Pattern.compile(regexStr34); Matcher matcher34 = pattern34.matcher(content34); System.out.println("测试(?i)使用方式的结果:--------------------"); while (matcher34.find()) { System.out.println(matcher34.group()); } //\\数字(表示外部分组引用) 与 $数字(表示内部分组引用) String regexStr35 = "(.)\\1{1}"; //表示只有任意连续两个重复字符的字符串 (.)\\1{1} ==> (.)\\1; String content35 = "aabb"; Pattern pattern35 = Pattern.compile(regexStr35); Matcher matcher35 = pattern35.matcher(content35); System.out.println("测试\\\\数字的结果:--------------------"); while (matcher35.find()) { System.out.println(matcher35.group()); } String afterReplaceStr = matcher35.replaceAll("$1"); //将匹配到的"aa"与"bb"分别替换为"a"与"b" 结果得到"ab" System.out.println("测试$数字的结果:--------------------"); System.out.println(afterReplaceStr); } }
3. 正则表达式实例运行结果
<以下是在jdk1.8.0_202下运行的结果> 测试[]的结果:-------------------- a a 测试{}使用方式1的结果:-------------------- aa aa 测试{}使用方式2的结果:-------------------- aaa 测试{}使用方式3的结果:-------------------- aaa 测试+使用方式1的结果:-------------------- a aaa 测试+使用方式2的结果:-------------------- a a a a + 测试*使用方式1的结果:-------------------- baaa 测试*使用方式2的结果:-------------------- a a a a * 测试?使用方式1的结果:-------------------- ba 测试?使用方式2的结果:-------------------- a a a a ? 测试-使用方式1的结果:-------------------- a c 测试-使用方式2的结果:-------------------- a - - 测试-使用方式3的结果:-------------------- a- 测试.使用方式1的结果:-------------------- a- ad a. 测试.使用方式2的结果:-------------------- . 测试^使用方式1的结果:-------------------- c - 测试^使用方式2的结果:-------------------- a 测试$的结果:-------------------- b 测试|使用方式1的结果:-------------------- ab 测试|使用方式2的结果:-------------------- a b | b 测试\\b的结果:-------------------- a 测试\\B的结果:-------------------- a a a 测试\\d的结果:-------------------- a1 a2 测试\\D的结果:-------------------- a ab 测试\\s的结果:-------------------- a 测试\\S的结果:-------------------- a1 a2 ab 测试\\w的结果:-------------------- a1 ab 测试\\W的结果:-------------------- a a天 测试()使用方式的结果:-------------------- abc a bc c 测试(?<>)使用方式的结果:-------------------- abc a a bc bc c c 测试(?:|)使用方式的结果:-------------------- ab acd 测试(?=|)使用方式的结果:-------------------- a a 测试(?!|)使用方式的结果:-------------------- a 测试(?i)使用方式的结果:-------------------- abc aBC 测试\\数字的结果:-------------------- aa bb 测试$数字的结果:-------------------- ab 进程已结束,退出代码0

浙公网安备 33010602011771号