----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
5. 正则表达式
专门处理字符串的一种技术,对字符串的复杂操作变得更为简单。 String,StringBuffer,StringBuilder处理字符串 功能不够强大 A 匹配功能 boolean matches(String regex) [^abc] 任何字符,除了 a、b 或 c(否定) Possessive 数量词 X?+ X,一次或一次也没有 X*+ X,零次或多次 X++ X,一次或多次 X{n}+ X,恰好 n 次 X{n,}+ X,至少 n 次 X{n,m}+ X,至少 n 次,但是不超过 m 次 预定义字符类 \d 数字:[0-9] \D 非数字: [^0-9] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] B 切割功能 String[] split(String regex) C 替换功能 String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 D 查找功能 使用的是java.util.regex.Pattern描述正则的类 步骤: 1.定义正则规则 2.使用Pattern类的静态方法Pattern.compile(String regex) 预编译正则规则 3.调用Pattern非静态方法 Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。 matcher匹配器,匹配compile方法中的正则规则 4.先调用Matcher类中的方法find查找boolean find() 获取找到的结果:Matcher类的方法 String group() int start() int end()匹配的字符串的下标
import java.util.regex.*;
class RegexDemo {
public static void main(String[] args) {
method_5();
}
//D.正则查找的功能
public static void method_5(){
String str = "my home zai yuan fang ni mei qu guo";
//找出3个字母的单词
//预编译正则
String reg = "\\b[a-zA-Z]{3}\\b"; // \b匹配单词边界
Pattern p = Pattern.compile(reg);
//正则规则,匹配字符串
Matcher m = p.matcher(str);
// System.out.println(m.find()); 返回布尔值
while(m.find()){
//System.out.println(m.group()); //要先find 后才获取
System.out.println(str.substring(m.start(), m.end()));
}
}
//验证电子邮件格式
public static void method_4(){
String email = "shisong@163.com.cn";
boolean b = email.matches( "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"); //com这里变成一个组 出现一次或多次
System.out.println(b); //true
}
//叠词的还原
public static void method_3(){
String str = "我.要要要.要要.学.学...学.编编...编..编....程.程程...程";
str = str.replaceAll("\\ .+" , ""); //”.”替换成空格
System.out.println(str);
str = str.replaceAll("(.)\\1+" , "$1");
System.out.println(str);
}
//C.正则表达式的替换作用
public static void method_2(){
String str = "helllowssorrrrrld";
String s = str.replaceAll("(.)\\1+" , "$1"); //捕获组 匹配后去替换 $, 叠词去重
System.out.println(s);
}
//B.正则表达式的切割作用
public static void method_1(){
String str = "abqqqqqcdettfdhhgtnssth";
//正则组( )专门处理叠词
//(.)表示的是一个组,重用性,对组进行编号 \\1 + 整个组出现一次到多次
String[] arr = str.split("(.)\\1+"); //(编号为1组)+出现一次或多次
for(String s : arr){
System.out.println(s);
}
}
//A.正则表达式的匹配作用
public static void method(){
String str = "f3f";
//检查 中间的字符是不是×××
boolean b = str.matches("f[\\d]f"); //^异或-不是, \d-数字
System.out.println(b);
String str1 = "tooooo";
b = str1.matches("to{2,4}");//x+(一次或多次);x{n}(恰好n次);x{n,}至少;x{n,m}至少n不超过m
System.out.println(b);
String num = "12800138000";
b = num.matches("1[3568][0-9]{9}");//验证手机号码
System.out.println(b);
}
}
练习 抓取网页的邮箱地址
/*
抓取网页的邮件地址
*/
import java.net.*;
import java.util.regex.*;
import java.io.*;
class CatchEmail {
public static void main(String[] args) throws Exception{
String reg = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
URL url = new URL("http://www.taobao.com");
//开启连接
// openConnection()返回URLConnection 对象,表示到 URL 所引用的远程对象的连接。
URLConnection conn = url.openConnection();
BufferedReader bfr = new
BufferedReader(new InputStreamReader(conn.getInputStream()));//返回从此打开的链接读取的输入流
String line = null;
while((line = bfr.readLine())!=null){
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(line);
while(m.find()){
System.out.println(m.group());
}
}
}
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------