黑马程序员--面向对象十一:正则

来源:互联网 发布:什么是社交数据 编辑:程序博客网 时间:2024/05/22 11:37

--------------JavaEE+Android+IOS开发、android培训、期待与您交流! ---------------

 

正则表达式:符合一定规则的表达式,它用于操作字符串,这样就简化对字符串的复杂操作。不过符号定义越多,正则越长,阅读性就会越差。

字符类

[abc] a、bc(简单类)

[^abc] 任何字符,除了a、bc(否定)

[a-zA-Z] a z A Z,两头的字母包括在内(范围)

[a-d[m-p]] a d m p:[a-dm-p](并集)

[a-z&&[def]] d、ef(交集)

[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

边界匹配器

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

\Z 输入的结尾,仅用于最后的结束符(如果有的话)

\z 输入的结尾

当想要对一个规则的结果进行重用,可以把这个规则封装成组,装进()中,这样这个组里的结果就可以重用。组从第一组开始标号。通过\N(n就是组的编号)的形式来表示捕获的组的内容,即表示当前这位上的规则要使用的规则就是那一组的规则的结果的重用。

Eg:

规则(.)\1中表示第一位是任意字符,第二位是对第一位的结果的重用。当把这个规则封装进String中时,要对\进行转义。即:"(.)\\1"

怎么看分辨组:一对括弧一组。按照括弧的顺序对组从1开始编号。

$的用法

【通过$n可以获取到前面的规则中的第N组的结果。】

eg:

replaceAllDemo(Str,"(.)\\1+","$1").$1表示获取(.)这个组的结果来使用。

具体操作功能

1.匹配:

String类中的matches(regex)方法,用规则匹配字符串,只要有一处不符合规则就匹配结束,返回false

2.切割:

String类中的split(Stringregex)方法,根据给定正则表达式的匹配拆分此字符串。

3.替换

String类中的replaceAll(Stringregex,String replacement)方法,使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

4.获取

将字符串中符合规则的子串取出

1.把正则封装成pattern对象.staticPatterncompile(String regex)

2.把正则对象和字符串关联

3.在匹配器中查找符合规则的字符串

4.取出这个字符串

①.Pattern类

static Patterncompile(String regex)将给定的正则表达式编译到模式中。

Matcher matcher(CharSequenceinput) 创建匹配给定输入与此模式的匹配器。

②.Matcher类

匹配器:同一个匹配器中使用同一个索引

通过解释 Patterncharactersequence 执行匹配操作的引擎。通过调用模式的 matcher方法从模式创建匹配器。

创建匹配器后,可以使用它执行三种不同的匹配操作:

matches 方法尝试将整个输入序列与该模式匹配。

lookingAt 尝试将输入序列从头开始与该模式匹配。

find 方法扫描输入序列以查找与该模式匹配的下一个子序列。每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。

boolean find()尝试查找与该模式匹配的输入序列的下一个子序列。

String group()返回由以前匹配操作所匹配的输入子序列。

得先找后获取:

while(find()){    group()}Eg:String str="";String regexstr="";Pattern p =Pattern.compile(String regexstr)//创建正则对象Matcher m = p.matcher(str);//字符串与正则对象关联while(m.fing())//查找{      m.group();//取出}


 

思路方式:
 1,如果只想知道该字符是否对是错,使用匹配。
 2,想要将已有的字符串变成另一个字符串,替换。
 3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
 4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

 

实例:网页爬虫/*网页爬虫(蜘蛛)*/import java.io.*;import java.util.regex.*;import java.net.*;import java.util.*;class RegexTest2 { public static void main(String[] args) throws Exception {  getMails_1(); } public static void getMails_1()throws Exception {  URL url = new URL("http://192.168.1.112: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());   }  } } /* 获取指定文档中的邮件地址。 使用获取功能。Pattern  Matcher */ public static void getMails()throws Exception {  BufferedReader bufr =    new BufferedReader(new FileReader("mail.txt"));  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());   }  } }}


--------------JavaEE+Android+IOS开发、android培训、期待与您交流! ---------------