服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

正则表达式概述及在java中的使用


  概述
  
  你是否使用过查找*.tmp临时文件
  
  你是否使用过编辑工具中的查找/替换功能
  
  其实它们都使用了正则表达式
  
  正则表达式的作用
  
  提供更强大的字符串处理能力
  
  测试字符串内的模式
  
  例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或身份证号码模式。即数据验证
  
  替换文本
  
  可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
  
  基于模式匹配从字符串中提取子字符串
  
  可以查找文档内或输入域内特定的文本。
  
  在java中使用正则表达式
  
  正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持
  
  jdk1.4中加入了java.util.regex包提供对正则表达式的支持。而且java.lang.string类中的replaceall和split函数也是调用的正则表达式来实现的。
  
  正则表达式对字符串的操作主要包括:
  
  1.字符串匹配
  
  2.指定字符串替换
  
  3.指定字符串查找
  
  4.字符串分割
  
  pattern类
  
  pattern类的实例表示以字符串形式指定的正则表达式,其语 法类似于perl所用的语法。
  
  用字符串形式指定的正则表达式,必须先编译成pattern类的 实例。生成的模式用于创建matcher对象,它根据正则表达式与任 意字符序列进行匹配。多个匹配器可以共享一个模式,因为它是非专属的
  
  用compile方法把给定的正则表达式编译成模式,然后用 matcher方法创建一个匹配器,这个匹配器将根据此模式对给定输 入进行匹配。pattern 方法可返回编译这个模式所用的正则表达 式。
  
  matcher类
  
  通过调用某个模式的matcher方法,从这个模式生成匹配器。 匹配器创建之后,就可以用它来执行三类不同的匹配操作:
  
  matches方法根据此模式,对整个输入序列进行匹配
  
  lookingat方法根据此模式,从开始处对输入序列进 行匹配。
  
  find方法扫描输入序列,寻找下一个与模式匹配的地方
  
  这些方法都会返回一个表示成功或失败的布尔值。如果匹配成功,通过查询 匹配器的状态,可以获得更多的信息
  
  构建正则表达式
  
  /d 等於 [0-9] 数字
  
  /d 等於 [^0-9] 非数字
  
  /s 等於 [ /t/n/x0b/f/r] 空白字符
  
  /s 等於 [^ /t/n/x0b/f/r] 非空白字符
  
  /w 等於 [a-za-z_0-9] 数字或是英文字
  
  /w 等於 [^a-za-z_0-9] 非数字与英文字
  
  $ 表示每行的结尾
  
  . 匹配所有字符,包括空格、tab字符甚至换行符
  | 或
  
  []方括号只允许匹配单个字符
  
  ^ 符号称为“否”符号。如果用在方括号内,表示不想要匹配的字符。 表示每行的开头
  
  ( ) 形成一组
  
  查询
  import java.util.regex.*;
  public class regexexample
  {
  public static void main(string[] args)
  {
  string str="aaabc efg abc";
  string regex="aaa|fff";
  pattern p=pattern.compile(regex);//编译成模式
  matcher m=p.matcher(str);//创建一个匹配器
  boolean rs=m.find();
  if(rs)
  {
  system.out.println("include!!!");
  }
  else
  {
  system.out.println("no include!!!");
  }
  }
  }
  
  如果str中有regex,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成pattern p=pattern.compile(regex,pattern.case_insensitive);
  
  提取
  
  (从本例给出所给完整路径中提取文件名)im()p(ort java.util.rege
  public class regexexample2
  {
  public static void main(string[] args)
  {
  string regex=".+////(.+)$";
  string str="c://dir1//dir2//name.txt";
  pattern p=pattern.compile(regex);
  matcher m=p.matcher(str);
  boolean rs=m.find();
  for(int i=1;i<=m.groupcount();i++)
  {
  system.out.println(m.group(i));
  }
  }
  }
  
  以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupcount();
  
  分割
  import java.util.regex.*;
  public class regexexample3
  {
  public static void main(string[] args)
  {
  string regex="::";
  pattern p=pattern.compile(regex);
  string[] r=p.split("xd::abc::cde");
  for(int i=0;i<r.length;i++)
  {
  system.out.println(r[i]);
  }
  }
  }
  
  执行后,r就是{“xd”,“abc”,“cde”},其实分割时还有跟简单的方法:
  string str="xd::abc::cde";
  string[] r=str.split("::");
  
  替换(删除)
  import java.util.regex.*;
  public class regexexample1
  {
  public static void main(string[] args)
  {
  string regex="a+";//表示一个或多个a
  pattern p=pattern.compile(regex);
  matcher m=p.matcher("aaabbced a ccdeaa");
  string s=m.replaceall("a");
  system.out.println(s);
  }
  }
  
  结果为"abbced a ccdea"
  
  如果写成空串,既可达到删除的功能,比如:
  string s=m.replaceall("");
  
  结果为"bbced ccde"

扫描关注微信公众号