选择显示字体大小

java中使用正则表达式实现字符串匹配

黑暗岁月

  有一个string,如何查询其中是否有y和f字符?最黑暗的办法就是:

  程序1:我知道if、for语句和charat()啊。

class test{
 public static void main(string args[]) {
  string str="for my money, the important thing "+"about the meeting was bridge-building";
  char x='y';
  char y='f';
  boolean result=false;
  for(int i=0;i<str.length;i++){
   char z=str.charat(i); //system.out.println(z);
   if(x==zy==z) {
    result=true;
    break;
   }
   else result=false;
  }
  system.out.println(result);
 }
}

  好像很直观,但这种方式难以应付复杂的工作。如查询一段文字中,是否有is?是否有thing或ting等。这是一个讨厌的工作。

  javajava.util.regex包

  按照面向对象的思路,把希望查询的字符串如is、thing或ting封装成一个对象,以这个对象作为模板去匹配一段文字,就更加自然了。作为模板的那个东西就是下面要讨论的正则表达式。先不考虑那么复杂,看一个例子: 程序2:不懂。先看看可以吧?

import java.util.regex.*;

class regex1{
 public static void main(string args[]) {
  string str="for my money, the important thing "+"about the meeting was bridge-building";
  string regex="af"; //表示a或f
  pattern p=pattern.compile(regex);
  matcher m=p.matcher(str);
  boolean result=m.find();
  system.out.println(result);
 }
}

  如果str匹配regex,那么result为true,否则为flase。如果想在查找时忽略大小写,则可以写成:

pattern p=pattern.compile(regex,pattern.case_insensitive);

  虽然暂时不知道pattern(模板、模式)和matcher(匹配器)的细节,程序的感觉就比较爽,如果先查询is、后来又要查询thing或ting,我们只需要修改一下模板pattern,而不是考虑if语句和for语句,或者通过charat()。

  1、写一个特殊的字符串——正则表达式如af。

  2、将正则表达式编译成一个模板:p

  3、用模板p去匹配字符串str。

  思路清楚了,现在看java是如何处理的(java程序员直到jdk1.4才能使用这些类。

  pattern类与查找

  ①public final class java.util.regex.pattern是正则表达式编译后的表达法。下面的语句将创建一个pattern对象并赋值给句柄p:pattern p=pattern.compile(regex);

  有趣的是,pattern类是final类,而且它的构造器是private。也许有人告诉你一些设计模式的东西,或者你自己查有关资料。这里的结论是:pattern类不能被继承,我们不能通过new创建pattern类的对象。

  因此在pattern类中,提供了2个重载的静态方法,其返回值是pattern对象(的引用)。如:

public static pattern compile(string regex) {
 return new pattern(regex, 0);
}

  当然,我们可以声明pattern类的句柄,如pattern p=null;

  ②p.matcher(str)表示以用模板p去生成一个字符串str的匹配器,它的返回值是一个matcher类的引用,为什么要这个东西呢?按照自然的想法,返回一个boolean值不行吗?

  我们可以简单的使用如下方法:

boolean result=pattern.compile(regex).matcher(str).find();

  其实是三个语句合并的无句柄方式。无句柄常常不是好方式。后面再学习matcher类吧。先看看regex——这个怪咚咚。

  正则表达式之限定符

  正则表达式(regular expression)是一种生成字符串的字符串。晕吧。比如说,string regex="me+";这里字符串me+能够生成的字符串是:me、mee、meee、meeeeeeeeee等等,一个正则表达式可能生成无穷的字符串,所以我们不可能(有必要吗?)输出正则表达式产生的所有东西。

  反过来考虑,对于字符串:me、mee、meee、meeeeeeeeee等等,我们能否有一种语言去描述它们呢?显然,正则表达式语言是这种语言,它是一些字符串的模式——简洁而深刻的描述。

  我们使用正则表达式,用于字符串查找、匹配、指定字符串替换、字符串分割等等目的。

  生成字符串的字符串——正则表达式,真有些复杂,因为我们希望由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)描述任意的字符串,而且要准确。

  先看几个正则表达式例子:

  程序3:我们总用这个程序测试正则表达式。

import java.util.regex.*;

class regex1{
 public static void main(string args[]) {
  string str="for my money, the important thing ";
  string regex="ab*";
  boolean result=pattern.compile(regex).matcher(str).find();
  system.out.println(result);
 }
}//ture

  ①"ab*"——能匹配a、ab、abb、abbb……。所以,*表示前面字符可以有零次或多次。如果仅仅考虑查找,直接用"a"也一样。但想想替换的情况。 问题regex="abb*"结果如何?

  ②"ab+"——能匹配ab、abb、abbb……。等价于"abb*"。问题regex="or+"结果如何?

  ③"or?"——能匹配o和or。? 表示前面字符可以有零次或一次。

  这些限定符*、+、?方便地表示了其前面字符(子串)出现的次数(我们用{}来描述): x*,零次或多次 ≡{0,}


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons