黑马程序员_正则表达式(正则匹配,替换,切割,获取,正则练习)

------- android培训java培训、期待与您交流! ----------

一.正则表达式特点


1.正则表达式:符合一定规则的表达式。
  作用:用于专门操作字符串。
  特点:用一些特定的符号来表示一些代码操作。这样就简化书写。
  所以学习正则表达式,就是在学习一些特殊符号的使用。

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

2.具体操作功能:
 1)匹配:String matches方法。
 2)切割:String split();
 3)替换:String replaceAll();

3.String类中方法:
  boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
  public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。
  调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:

  Pattern.matches(regex, str)

  参数:
  regex - 用来匹配此字符串的正则表达式
  返回:
  当且仅当此字符串匹配给定的正则表达式时,返回 true
  抛出:
  PatternSyntaxException - 如果正则表达式的语法无效

二 获取功能


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)
     替换模式与给定替换字符串相匹配的输入序列的每个子序列。


三正则表达式练习

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

*/

  1. class    
  2. {  
  3.  public static void main(String[] args)   
  4.  {  
  5.   String str = "我我..要..要要...学..学.习习.习..编.编..程....程程...";  
  6.     
  7.   str = str.replaceAll("\\.","");  
  8.   System.out.println(str);  
  9.   str = str.replaceAll("(.)\\1+" ,"$1");  
  10.   System.out.println(str);  
  11.  }  
  12. }  
  13.    
  14.    


 /*
需求2:
 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位即可。
 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
 2,将每一段只保留3位。这样,所有的IP地址都是每一段3位。
*/

  1. public class RegexTest {  
  2. public static void main(String[] args){  
  3.   
  4. String str = "192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";  
  5. str = str.replaceAll("(\\d+)","00$1");  
  6. System.out.println(str);  
  7. str = str.replaceAll("0*(\\d{3})","$1");  
  8. System.out.println(str);  
  9. String ips[]  = str.split(" ");  
  10.   
  11. TreeSet<String> ts = new TreeSet<String> ();  
  12. for(String ip : ips)  
  13.  ts.add(ip);  
  14. }  
  15. for(String ip : ts){  
  16.  String ip = ip.replaceAll("0*(\\d+)","$1");  
  17. }  


/*
需求3:
 对邮件地址进行校验。 
 获取指定文档中的邮件地址。(网页爬虫)
 使用获取功能。Pattern Matcher
  12312@126.com
*/


  1. class Test  
  2. {  
  3.  public static void main(String[] args)  
  4.  {  
  5.   URL  url = new URL("http://tieba.baidu.com/p/2346233770");  
  6.   URLConnection conn = url.openConnection();  
  7.   BufferedReader bufr =   
  8.    new BufferedReader(new InputStreamReader(conn.getInputStream());  
  9.   String line = null;  
  10.   String mailRegex = "\\w+@\\w+(\\.\\w)+";  
  11.   Pattern p = Pattern.compile(mailRegex);  
  12.      
  13.   while((line = bufr.readLine())!= null){  
  14.      
  15.    Matcher m = p.matcher(line);  
  16.    while(m.find())  
  17.    {  
  18.     System.out.println(m.group());  
  19.    }  
  20.   }  
  21.  }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值