----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------
正则表达式:按照我的理解它就是一种字符串的排列方式,有了正则表达式,我们就可以按照自己想要的方式来排列一个字符串。有这个字符串,我们就可以用其它的字符串来与之匹配操作,如是否这个规则,把一长串字符串中符合这个规则的内容删除、替换等等。
那么,这个正则表达式的规则有哪些呢?举一些最常见的出来:
字符类 | |
---|---|
[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] |
边界匹配器 | |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过m 次 |
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
组零始终代表整个表达式。
步骤如下:
1. 将正则表达式封装成对象
Pattern p = Patteren.compile(String reg);
2. 将要操作的字符串与正则表达式对象关联,并返回匹配引擎
Matcher m = p.matcher(CharSequence input);
3. 对匹配引擎m进行操作,获取、替换、删除等
下面是一个从网页上获取邮箱的爬虫,用来展示正则表达式的作用:
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex {
public static void main(String[] args) throws Exception {
getMail();
}
public static void getMail() throws Exception{
//用URL类读取一个网址上出现的邮箱,下面这个网址是随机选取的
URL url = new URL("http://tieba.baidu.com/p/2070591207");
URLConnection conn = url.openConnection();
BufferedReader bufr =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
//邮箱的正则表达式
String mailReg = "\\w+@\\w+(\\.\\w+)+";
//将正则表达式封装成对象
Pattern p = Pattern.compile(mailReg);
while((line=bufr.readLine())!=null){
//让要操作的字符串和正则对象关联,返回匹配引擎
Matcher m = p.matcher(line);
while(m.find()){
//获取匹配到的邮箱
System.out.println(m.group());
}
}
}
打印结果:
396725195@qq.com
653473865@qq.com
653473865@qq.com
372929805@qq.com
1396703516@qq.com
572857852@qq.com
1209298042@qq.com
可以很清晰的看到,在一个随机的网页上获取到了我们想要的邮箱,这便是正则表达式的威力。同时,我们可以用正则表达式操作更加复杂的内容,表达式更加难写一些。
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------