---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码操作,简化书写。
好处:简化了对字符串的复杂操作。
弊端:符号定义越多,正则表达式越长,阅读性越差。
正则表达式的规则:
1、中括号"[ ]":括号内表示字符串中某个字符位置字符的取值范围。
[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](减去)
2、预定义的字符类:
. 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w]
3、数量词
Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次 4、边界匹配器
边界匹配器
^
行的开头
$
行的结尾
\b
单词边界
\B
非单词边界
\A
输入的开头
\G
上一个匹配的结尾
\Z
输入的结尾,仅用于最后的结束符(如果有的话)
\z
输入的结尾
具体的操作功能:
1、匹配:String matches(String reg)方法。用规则匹配整个字符串,只要有一处不符合就匹配结束返回flase
2、切割:String[] split(String reg);定义一个字符串规则:String reg;
把reg这个规则作为参数传递给matches方法,此方法返回boolean。
定义一个String reg规则作为参数传递给split方法,此方法按照规则切割字符串并返回一个String类型的数组。
3、替换:
replaceAll(String regex,String replacement)
;
使用给定的 replacement 替换此字符串所有匹配给定的这则表达式regex的子字符串。
4、获取:将字符串中符合规则的字串取出。
概括的说就是将规则封装成对象(Pattern),然后把对象和要操作的对象关联起来(Matcher)进行操作。
1、将正则表达式封装成对象。 public final classPatternextendsObjectimplementsSerializable 正则表达式的编译表示形式,可以描述正则表达式,将正则表达式封装。
Pattern类没有直接的构造函数,可以使用类方法compile(String regex)返回一个编译了regex规则的Pattern对象。
2、使用Pattern中的方法Matcher将正则表达式对象和要操作的字符串关联,返回一个Matcher对象。
Matcher
matcher(CharSequence input)
创建匹配给定输入与此模式的匹配器。Matcher类中包含大量的方法可以操作字符串。
3、关联后,获取正则匹配引擎。
4、通过引擎对符合规则的字串操作,比如:取出。
import java.util.regex.*; class RegexDemo2 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str = "ming tian jiu yao fang jia le, da jia."; String reg = "[a-z]{3}"; //Pattern没有构造器,使用类方法compile方法封装一个编译了reg规则的Pattern对象 Pattern p = Pattern.compile(reg); //让正则对象和要作用的字符串相关联,获取匹配器对象。 Matcher m = p.matcher(str); /*以下方法类似一个迭代器,会依次的寻找符合规则的下一个子串 //将规则作用到字符串上,并进行符合规则的字串查找。 boolean b = m.find(); System.out.println(b); //获取匹配到的一个结果 第一次输出min System.out.println(m.group()); */ //所以可以使用循环的方法依次寻找子串 while (m.find) { //获得字串在字符串中的开始角标和末尾角标 System.out.println(m.start()+"..."+m.end()); System.out.println(m.group()); } } }
网页爬虫的练习:
<pre name="code" class="java">import java.util.regex.*;
import java.io.*;
class RegexTest2
{
public static void main(String[] args)
{
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 buffIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
*/
BufferedReader buff =
new BufferedReader(new FileReader("mail.txt");
String line = null;
//定义邮箱地址的正则规则
String mailregex = "\\w+@\\w+(\\.\\w+)+);
//将邮箱正则规则封装成Pattern对象
Pattern p = Pattern.compile(mailregex);
//每次从流中读取一行,并把这一行作为要操作的数据与正则对象关联
//然后使用find方法依次匹配符合规则的子串用group获取
while((line = buff.readline()) != null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}
---------------------- ASP.Net+Android+IOS开发 、 .Net培训 、期待与您交流! ----------------------