正则表达式:符合一定规则的表达式,用于操作字符串。
1.匹配:boolean matches();如果匹配整个字符串,只要有一处不符合,就匹配结束,返回false。例如: //检测手机号码,号码格式必须要以13,15,18开头的11位数字 public static void checkTel(String tel) { String telReg = “1[358]\\d{9}”; //这串正则表达式的意思就是以数字1开头,3,5,8作为第二位数字。任意数字作为第三位数字并且连续出现9次 boolean b = tel.matches(reg); System.out.println(b); } 2.切割:String[] split() 把符合规则的字符串都排除在外。 //例如有一串字符串,中间有多个空格。按照多个空格切 public static void splitDemo(String str) { String reg = “ +”;//空格出现了一次或者多次的时候,符合正则表达式 String[] arr = str.split(“reg”); for(String s : arr) { System.out.println(s); } 3.替换:String replaceAll(regex, str) 把符合规则的字符串都替换掉 //例如:有一段字符串erkktyqqquizzzzzo。把叠词都替换成#号 String str = “erkktyqqquizzzzzo”; String reg = “(.)\\1+”; // .代表任意字符,括号括起来的代表为组。\1代表组的编号 str.replaceAll(reg, “#$1”);// $1代表序号为1的组 4.将字符串中的符合规则的子串取出 步骤: (1) 将正则表达式封装成对象 (2) 让正则对象和要操作的字符串相关联 (3) 关联后,获取正则匹配引擎 (4) 通过引擎对符合规则的子串进行操作,比如取出 代码示例: //将一段字符串中,长度为3的单词取出 String str = “ming tian jiu yao fang jia le , da jia”; String reg = “\\b[a-z]{3}\\b”; // \b代表单词边界符 //将规则封装成对象 Pattern p = Pattern.compile(reg); //让正则表达式和要作用的字符串关联,获取匹配器对象 Matcher m = p.matcher(str); while(m.find()) { //find方法会去寻找符合规则的字符串 System.out.println(m.group()); }//group方法为取出
· 思考:正则表达式的4种功能,什么时候该用哪一个呢?
思路方式:
1. 如果只想知道该字符串是否对错,使用匹配
2. 想要将已有的字符串变成另一个字符串,替换
3. 想要按照自己定义的方式将一个字符串变成多个字符串。切割,获取规则以外的子串
4. 想要拿到符合需求的字符串子串,获取,获取符合规则的子串
常用的有:
字符类:
[abc] : 代表单个字符,这个字符可以是a/b/c中的一个
[^abc] : 代表单个字符,这个字符可以是除了abc的任意一个
[a-zA-Z] :代表单个字符,这个字符是a-z和A-Z中的一个
[a-d[m-p]] :并集的方法
[a-z&&[def]] :交集的方法
预定义字符类:
. : 任何字符
\d : 数字[0-9]
\D : 非数字
\s : 空白字符
\S : 非空白字符
\w : 单词字符[a-zA-Z_0-9]
\W : 非单词字符
边界匹配器:
^ 行的开头
$ 行的结尾
\b 单词的边界
\B 非单词的边界
数量词
X? 一次或者一次没有
X* 零次或者多次
X+ 一次或者多次
X{n} 恰好n次
X{n,} 最少n次
X{n,m} 至少n次,不超过m次
组
被括号括起来是为组,在组的后面有个\n,n就是组的序号。通过$n可以调用组的内容
正则表达式的代码示例:
1. 对邮件地址进行校验
public static void checkMail() { String mail = "[email protected]"; mail = "[email protected]"; String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。 reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。 //mail.indexOf("@")!=-1 System.out.println(mail.matches(reg)); }2. 将下列字符串转成:我要学编程
public static void test() { String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"; /* 将已有字符串变成另一个字符串。使用 替换功能。 1,可以先将 . 去掉。 2,再将多个重复的内容变成单个内容。 */ str = str.replaceAll("\\.+",""); str = str.replaceAll("(.)\\1+","$1"); System.out.println(str); }
/* 网页爬虫(蜘蛛) */ import java.io.*; import java.util.regex.*; import java.net.*; import java.util.*; class RegexTest2 { public static void main(String[] args) throws Exception { getMails(); } public static void getMails()throws Exception { URL url = new URL("http://192.168.1.254:8080/myweb/mail.html"); URLConnection conn = url.openConnection(); BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; String mailreg = "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(mailreg); while((line=bufIn.readLine())!=null) { Matcher m = p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } }