概念
正则表达式定义字符串的搜索模式
正则表达式的英文全称是regular expression。搜索模式可以是简单字符,固定字符串或包含描述模式的特殊字符的复杂表达式的任何内容
由正则表达式定义的 pattern 可以同时匹配一个或多个,或者一个都没匹配到
正则表达式可用于搜索,编辑和操作文本
使用正则表达式分析或修改文本的过程称为:正则表达式应用于文本/字符串
由正则表达式定义的模式从左到右应用于文本。
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误
查询字符串是否存在所要求的子字符串
import java.util.regex.Pattern; public class PatternMethod { public static void main(String[] args) { String s = "fwqwqwaegrhgfngjnuyjhk"; String pattern = ".*fng.*";//.任意字符串 *任意长度,查找”····fng·····“ String pattern1 = "fw.*";//fw开头+后面多少个任意字符都行 查找“fw···········” String pattern2 = ".+wa.*";//任意字符多少个+wa+任意字符多少个 查找”····wa·····“ String pattern3 = ".+nuy.+";//任意字符多少个+nuy+任意字符多少个查找”····nuy·····“ String pattern4 = ".+jhk";//前面多少任意个字符都行+jhk结尾 查找“·············jhk” System.out.println(Pattern.matches(pattern, s));// System.out.println(Pattern.matches(pattern1, s)); System.out.println(Pattern.matches(pattern2, s)); System.out.println(Pattern.matches(pattern3, s)); System.out.println(Pattern.matches(pattern4, s)); } }
import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMethod2 { public static void main(String[] args) { //在字符串中通过指定要求来查找子字符串 //在java中,\是转译字符,\\表示要插入一个正则表达式的\ String content = "This pr2324oduct d 343564 is very good, QT3000! fsf 546 OK?"; String pattern = "(\\D*)(\\d*)(.*)"; //查找不是数字的字符 查找是数字的字符 任意字符 //因为后面加了 * ,代表着任意数量的字符 //创建patter对象 Pattern pa = Pattern.compile(pattern); //匹配字符串 Matcher ma = pa.matcher(content); //输出内容 if(ma.find()) {//这里,matcher按照(\\D*)(\\d*)(.*)的顺序查找,并保留每次的查询进度 System.out.println("找到字符串:" + ma.group(0)); //ma.group(0),表示3个查询条件的查询结果 System.out.println("找到字符串:" + ma.group(1)); //按照第一个(\\D*)条件从第一位查询,结果为This pr2 System.out.println("找到字符串:" + ma.group(2)); //按照(\\d*)条件从上次查询剩下的字符串开始查询,结果为2324 System.out.println("找到字符串:" + ma.group(3)); //按照(。*)条件从上次查询剩下的字符串开始查询,oduct d 343564 is very good, QT3000! fsf //546 OK? } else { System.out.println("没有匹配成功!"); } // String str = "fasfdhg2343fj hgtj32534 gr346! @6768"; // String pattern = "(\\D*)(\\d*)(j\\b)(.*)"; // //String pattern = "(\\d*)(.*@)(\\D*)(.*)"; // //String pattern = "(\\d*)(\\D*)(.*@)(.*)"; // Pattern pa = Pattern.compile(pattern); // Matcher ma = pa.matcher(str); // if(ma.find()) { // System.out.println(ma.group(0));//0是整个字符串, // System.out.println(ma.group(1));//1是按照第一个()里的内容查找 // System.out.println(ma.group(2));//在查找中,程序已经按照pattern里的括号的顺序进行过查找 // System.out.println(ma.group(3));//后者在前者找的基础上进行寻找,下标逐渐后移 // System.out.println(ma.group(4)); // } } }
import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMethod3 { public static void main(String[] args) { //匹配指定字符 String s = "hello everyone!"; //定义匹配模式 String regEx = "w|e";//查找是否存在其中一个 Pattern pa = Pattern.compile(regEx); Matcher matcher = pa.matcher(s); boolean flag = matcher.find(); System.out.println(flag); System.out.println("-------------------------"); String s2 = "D:\\hello.txt"; String regEx2 = ".+(.+)$";//任意字符多少个+(任意字符多少个)结尾 Pattern pa2 = Pattern.compile(regEx2); Matcher ma = pa2.matcher(s2); boolean flag2 = ma.find(); System.out.println(flag2); for (int i = 0; i < ma.groupCount(); i++) { System.out.println(ma.group(i)); } //分割字符串 String regEx3 = ":"; Pattern pa3 = Pattern.compile(regEx3); String[] strs = pa3.split("小明:小红:小李"); System.out.println(Arrays.toString(strs)); String s3 = "hello#world"; String[] strs2 = s3.split("#"); System.out.println(Arrays.toString(strs2)); } }
查询字符串中子字符串出现的次数
import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMethod4 { public static void main(String[] args) { //比如统计单词"dog"在字符串中出现的次数 String content = "dog dog dog doggies dog"; String reg = "\\bdog\\b";//\b:边界,意思是dog两边为边界 Pattern pa = Pattern.compile(reg); Matcher ma = pa.matcher(content); int count = 0; while (ma.find()) { count++; System.out.println("匹配到的数量:" + count); System.out.println("开始匹配的位置:" + ma.start());//开始查找的地方 System.out.println("结束位置:" + ma.end());//查找结束的地方 //每次查找中,查找的位置都会向后相应移动 } } }
import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMethod5 { public static void main(String[] args) { // String reg = "foo";//以foo开头 // String s1 = "foooooooooooooooooooooo"; // String s2 = "oofooo foo oooooooo ooooooo"; String s1 = "This pr2324oduct d 343564 is very good, QT3000! fsf 546 OK?"; String s2 = "This pr2324oduct d 343564 is very good, QT3000! fsf 546 OK?"; String reg = "good"; Pattern pattern = Pattern.compile(reg); Matcher ma1 = pattern.matcher(s1); Matcher ma2 = pattern.matcher(s2); System.out.println("正则:" + reg); System.out.println("s1:" + s1); System.out.println("s2:" + s2); //调用方法 //System.out.println("lookingAt():" + ma1.lookingAt()); //System.out.println("matches():" + ma2.matches());//字符串必须和正则表达式完全相同 // System.out.println("lookingAt():" + ma2.lookingAt());//从开头开始匹配(只匹配开头) if(ma1.find()){//必须在ma1.find()返回true,找到了对应字符串,才能使用ma1.group()输出找到的内容 System.out.println("group11111():" + ma1.group()); } if(ma2.find()){ System.out.println("group2222():" + ma2.group()); } } }
查找并输出字符串中特定的子字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMethod6 { public static void main(String[] args) { String s = "暗 示 法·c不bdf15284345626都mnhg是hj138457694354250m废,15267866576490j话"; // String reg = "[\u4e00-\u9fa5]";//是否是中文 //String reg = "(152|138)(\\d*)";//以152或者138开头的,有任意位数字的一连串数字 //String reg = "(152|138)(\\d){8}"; String reg = "(152|138)\\d{8}";//以152或者138开头的,有8位数字的一连串数字 Pattern p = Pattern.compile(reg); Matcher ma = p.matcher(s); int count = 0; while(ma.find()){ count ++; System.out.println(ma.group()); System.out.println(count); } } }
匹配中文
[\u4E00-\u9fA5]
匹配html
<(\S*?)[^>]*>.*?</\1>|<.*?/>
匹配腾讯qq
[1-9][0-9]{4,}
匹配身份证
\d{15}|\d{18}
匹配ip地址
\d+\.\d+\.\d+\.\d+ [192.169.0.1]