1概念
正则表达式(正确的规则,体现是一个表达式)
正则表达式用于操作字符串数据,通过一些特定的符号来体现的,所以我们为了掌握正则表达式,必须要学习一些符号,虽然简化了,但是阅读性差。
需要使用到java.lang包à
|
|
2作用
正则表达式的作用是为了校验用户输入的字符。
比如校验用户进行注册时的用户名和密码的校验。
代码示例:
|
package 正则表达式的演示;
/* * 正则表达式。 * * 正则表达式用于操作字符串数据。 * 通过一些特定的符号来体现的。 * 所以我们为了掌握正则表达式,必须要学习一些符号。 * * 虽然简化了,但是阅读性差。 */
/* * 需求:定义一个功能对QQ号进行校验。 * 要求:长度5~15. 只能是数字, 0不能开头 */ public class RegexDemo {
public static void main(String[] args) {
//使用正则来校验 String qq = "123k4567"; // checkQQ(qq);
String regex = "[1-9][0-9]{4,14}";//正则表达式。
boolean b = qq.matches(regex); System.out.println(qq+":"+b);
// String str = "aoooooooob"; // String reg = "ao{4,6}b"; // boolean b = str.matches(reg); // System.out.println(str+":"+b);
}
//使用传统的方法来校验 public static void checkQQ(String qq){
int len = qq.length();. . ..
if(len>=5 && len<=15){
if(!qq.startsWith("0")){ try { long l = Long.parseLong(qq);
System.out.println(l+":正确"); }catch(NumberFormatException e){ System.out.println(qq+":含有非法字符"); }
}else{ System.out.println(qq+":不能0开头"); } }else{ System.out.println(qq+":长度错误"); }
}
}
|
返回结果:
3常见的规则
|
|
链接:正则表达式
|
[abc] |
a、b 或 c(简单类) |
|
[^abc] |
任何字符,除了 a、b 或 c(否定) |
|
[a-zA-Z] |
a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
|
[a-d[m-p]] |
a 到 d 或 m 到 p:[a-dm-p](并集) |
|
[a-z&&[def]] |
d、e 或 f(交集) |
|
[a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](减去) |
|
[a-z&&[^m-p]] |
a 到 z,而非 m 到 p:[a-lq-z](减去) |
|
|
|
|
预定义字符类 |
|
|
. |
任何字符(与行结束符可能匹配也可能不匹配) |
|
\d |
数字:[0-9] |
|
\D |
非数字: [^0-9] |
|
\s |
空白字符:[ \t\n\x0B\f\r] |
|
\S |
非空白字符:[^\s] |
|
\w |
单词字符:[a-zA-Z_0-9] |
|
\W |
非单词字符:[^\w] |
|
Greedy 数量词 |
|
|
X? |
X,一次或一次也没有 |
|
X* |
X,零次或多次 |
|
X+ |
X,一次或多次 |
|
X{n} |
X,恰好 n 次 |
|
X{n,} |
X,至少 n 次 |
|
X{n,m} |
X,至少 n 次,但是不超过 m 次 |
|
|
|
|
Reluctant 数量词 |
|
|
X?? |
X,一次或一次也没有 |
|
X*? |
X,零次或多次 |
|
X+? |
X,一次或多次 |
|
X{n}? |
X,恰好 n 次 |
|
X{n,}? |
X,至少 n 次 |
|
X{n,m}? |
X,至少 n 次,但是不超过 m 次 |
|
|
|
数量词的演示
代码示例:
|
/* * 演示正则数量词 * * X? X,一次或一次也没有 * X* X,零次或多次 * X+ X,一次或多次 * X{n} X,恰好 n 次 * X{n,} X,至少 n 次 * X{n,m} X,至少n 次,但是不超过 m 次 */ String str = "aoooooob"; String reg = "ao{4,6}b";//X{n,m} X,至少n 次,但是不超过 m 次 4到6次 boolean c = str.matches(reg); System.out.println(str+":"+c);
} |
返回结果:
4常见的功能匹配
代码示例:
|
package 正则功能的使用;
import java.util.regex.Matcher; import java.util.regex.Pattern;
/** * 正则表达式对字符串的常见操作 * @author Administrator * */ public class RegexDemo2 {
public static void main(String[] args) {
/* * 正则表达式对字符串的常见操作: * 1, 匹配。 * 其实使用的就是String类中的matches方法。 * * 2,切割。 * 其实使用的就是String类中的split方法。 * * 3,替换。 * 其实使用的就是String类中的replaceAll()方法。 * * 4,获取。 * */ // functionDemo_1(); // functionDemo_2(); functionDemo_3(); // functionDemo_4();
}
/* * 获取 * 将正则规则进行对象的封装。 * Pattern p = Pattern.compile("a*b"); * //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher . * Matcher m = p.matcher("aaaaab"); * //通过Matcher匹配器对象的方法对字符串进行操作。 * boolean b = m.matches(); * * */ public static void functionDemo_4() {
String str = "da jia hao,ming tian bu fang jia!";
String regex = "\\b[a-z]{3}\\b";
//1,将正则封装成对象。 Pattern p = Pattern.compile(regex); //2, 通过正则对象获取匹配器对象。 Matcher m = p.matcher(str);
//使用Matcher对象的方法对字符串进行操作。 //既然要获取三个字母组成的单词 //查找。 find(); System.out.println(str); while(m.find()){ System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end()); } }
/* * 替换 */ public static void functionDemo_3() {
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
String tel = "15800001111";//158****1111;
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
}
/* * 切割。 * * 组:((A)(B(C))) */ public static void functionDemo_2(){
String str = "zhangsan xiaoqiang zhaoliu";
String[] names = str.split(" +");//str.split("\\.");
for(String name : names){ System.out.println(name); }
} /* * 演示匹配。 */ public static void functionDemo_1(){
//匹配手机号码是否正确。 String tel="18270789979" ;
String regex="1[358]\\d{9}";// \d表示0-9
boolean b =tel.matches(regex); System.out.println(tel+":"+b);
}
}
|
5.网页爬虫
什么是爬虫?
网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。
案例:爬取互联网上的邮箱账号。
代码示例:
|
package 爬虫;
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;
/* * 网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。 * * 爬取邮箱地址。 * */ public class RegexTest2 {
public static void main(String[] args) throws IOException {
List<String> list = getMailsByWeb();
for(String mail : list){ System.out.println(mail); } }
public static List<String> getMailsByWeb() throws IOException {
//1,读取源文件。 // BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
URL url = new URL("http://www.chinawenben.com/file/6vpczzuz6vowzxuxcwuzowzc_1.html");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//2,对读取的数据进行规则的匹配。从中获取符合规则的数据. String mail_regex = "\\[email protected]\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufIn.readLine())!=null){
/*Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();*/
Matcher m = p.matcher(line); while(m.find()){ //3,将符合规则的数据存储到集合中。 list.add(m.group()); }
} return list; }
public static List<String> getMails() throws IOException{
//1,读取源文件。 BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2,对读取的数据进行规则的匹配。从中获取符合规则的数据. String mail_regex = "\\[email protected]\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufr.readLine())!=null){
Matcher m = p.matcher(line); while(m.find()){ //3,将符合规则的数据存储到集合中。 list.add(m.group()); }
} return list;
}
}
|