您的位置:首页 > 职场人生

黑马程序员_正则表达式

2013-06-19 16:44 295 查看
----------- android培训java培训、java博客、java学习型技术博客、期待与您交流! --------------

本章主要的知识点总结:1、正则表达式的介绍及字符串的四种功能

                                        2、类
Pattern类 Matcher类的使用及其常见方法
                         
              3、 正则表达式具体运用的练习,网页爬虫

                                      

一.正则表达式介绍

       1.正则表达式:符合一定规则的表达式。

               作用:用于专门操作字符串。

                特点:用一些特定的符号来表示一些代码操作。这样就简化书写。

                   学习正则表达式,就是在学习一些特殊符号的使用。 

         好处是可以简化对字  符串的复杂操作。弊端:符号定义越多,正则越长,会使阅读性越差。

 

      2.具体操作功能:

构造         匹配
 
字符
x字符 x
\\反斜线字符
\0n带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh带有十六进制值 0x 的字符 hh
\uhhhh带有十六进制值 0x 的字符 hhhh
\t制表符 ('\u0009')
\n新行(换行)符 ('\u000A')
\r回车符 ('\u000D')
\f换页符 ('\u000C')
\a报警 (bell) 符 ('\u0007')
\e转义符 ('\u001B')
\cx对应于 x 的控制符
字符类
[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 次
( 1)、匹配:String matches方法,用规则匹配整个字符串,只要一处不匹配,匹配结束,就返回false。
( 2)、切割split(String regex,
int limit) ,根据匹配给定的正则表达式来拆分此字符串。

 (3)、替换:String replaceAll();

补充:叠词运用可使用组,将规则封装成组,用()完成,组都有编号,从1开始,通过\n(n就是组的编号)的形式获取。

(4)获取功能

 1.  操作步骤:

  (1)、将正则表达式封装成对象。

 (2)、让正则对象和要操作的字符串相关联。

 (3)、关联后,获取正则匹配引擎。

 (4)、通过引擎对符合规则的子串进行操作,比如取出。

 2.类 Pattern(java.util.regex)

( 1)正则表达式的编译表示形式。 

  指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,

  依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,

  所以多个匹配器可以共享同一模式。 

  因此,典型的调用顺序是 

  Pattern p = Pattern.compile("a*b");

  Matcher m = p.matcher("aaaaab");

  boolean b = m.matches();

 (2)常用方法

  static Pattern compile(String regex) 

     将给定的正则表达式编译到模式中。 

  Matcher matcher(CharSequence input) 

     创建匹配给定输入与此模式的匹配器。 

  static boolean matches(String regex, CharSequence input) 

     编译给定正则表达式并尝试将给定输入与其匹配。 

  String pattern() 

     返回在其中编译过此模式的正则表达式。 

  static Pattern compile(String regex, int flags) 

     将给定的正则表达式编译到具有给定标志的模式中。 

  int flags() 

     返回此模式的匹配标志。 

  String[] split(CharSequence input) 

     围绕此模式的匹配拆分给定输入序列。 

        3.类 Matcher(java.util.regex )

  (1)通过解释 Pattern 对 character sequence 执行匹配操作的引擎。

  通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

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

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

  find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

  每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。

(2)常用方法

  int end() 

     返回最后匹配字符之后的偏移量。 

  boolean find() 

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

  boolean find(int start) 

     重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 

  String group() 

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

  boolean lookingAt() 

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

  boolean matches() 

     尝试将整个区域与模式匹配。 

  Pattern pattern() 

     返回由此匹配器解释的模式。 

  int start() 

     返回以前匹配的初始索引。 

  Matcher reset() 

     重置匹配器。 

  String replaceAll(String replacement) 

     替换模式与给定替换字符串相匹配的输入序列的每个子序列。

4.String类中方法

  boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。

  public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。 

  调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:

  Pattern.matches(regex, str)

  参数:

  regex - 用来匹配此字符串的正则表达式 

  返回:

  当且仅当此字符串匹配给定的正则表达式时,返回 true 

  抛出: 

  PatternSyntaxException - 如果正则表达式的语法无效

二、正则表达式练习

 将下列字符串转成:我要学编程。
 String str = "我我。。。我我。。。。我要。。要要。。。。要要。。学学学。。学编。。编编编。。。。程程程";

<
fc8c
span style="color:rgb(0,153,0);">class    

{  

 public static void main(String[] args)   

 {  

  String str = "我我..要..要要...学..学.习习.习..编.编..程....程程...";  

    

  str = str.replaceAll("\\.","");  

  System.out.println(str);  

  str = str.replaceAll("(.)\\1+" ,"$1");  

  System.out.println(str);  

 }  

}  

   

   

 

192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30

 将IP地址进行地址顺序的排序。

 到底用四种功能中的哪一个呢?或者哪几个呢?

 思考方式:

 1、如果只想知道该字符是对是错,使用匹配。

 2、想要将已有的字符串变成另一个字符串,替换。

 3、想要按照自定的方式将字符串变成多个字符串。切割:获取规则以外的子串。

 4、想要拿到符合需求的字符串子串,获取:获取符合规则的子串。

 按照字符串自然顺序,只要让它们每一段都是3位即可。

 按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。

  将每一段只保留3位。这样,所有的IP地址都是每一段3位。

public class RegexTest {  
public static void main(String[] args){  
  
String str = "192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";  
str = str.replaceAll("(\\d+)","00$1");  
System.out.println(str);  
str = str.replaceAll("0*(\\d{3})","$1");  
System.out.println(str);  
String ips[]  = str.split(" ");  
  
TreeSet ts = new TreeSet ();  
for(String ip : ips)  
 ts.add(ip);  
}  
for(String ip : ts){  
 String ip = ip.replaceAll("0*(\\d+)","$1");  
}  

 
对邮件地址进行校验。   获取指定文档中的邮件地址。(网页爬虫)  



class
 Test  

{  

 public static void main(String[] args)  

 {  

 URL  url = new URL("http://tieba.baidu.com/p/2346233770");  

  URLConnection conn = url.openConnection();  

  BufferedReader bufr =   

   new BufferedReader(new InputStreamReader

(conn.getInputStream());  

  String line = null;  

  String mailRegex = "\\w+@\\w+(\\.\\w)+";  

  Pattern p = Pattern.compile(mailRegex);  

     

  while((line = bufr.readLine())!= null){  

     

   Matcher m = p.matcher(line);  

   while(m.find())  

   {  

    System.out.println(m.group());  

   }  

  }  

 }  

}  

   

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: