正则表达式的作用

2009年5月3日星期日

正则表达式的作用


正则表达式在很多语言中都会用到,其内容几乎是独立于具体语言。事实上,正则表达式有着非常广泛的应用。下面就来说一下正则表达式是什么,以及它有什么作用.
正则表达式的英文是regularexpression,意思是符合某种规则的表达式,可以将其理解为一种对文字进行模糊匹配的语言。正则表达式用一些特殊的符号(称为元字符)来代表具有某种特征(例如,某一字符必须是数字字符)的一组字符以及指定匹配的的次数,含有元字符的文本不再表示某一具体的文本内容,而是形成了一种文本模式,可以匹配符合该模式的所有文本串
提供更强大的字符串处理能力,测试字符串内的模式,例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或身份证号码模式。即数据验证替换文本可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
基于模式匹配从字符串中提取子字符串可以查找文档内或输入域内特定的文本。
在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字符甚至换行符或[]方括号只允许匹配单个字符^符号称为否符号。如果用在方括号内,表示不想要匹配的字符。表示每行的开头()形成一组查询

importjava.util.regex.*;publicclassRegexExample{publicstaticvoidmain(String[]args){Stringstr=aaabcefgABC;StringregEx=aaafff;Patternp=Pattern.compile(regEx);//编译成模式Matcherm=p.matcher(str);//创建一个匹配器booleanrs=m.find();if(rs){System.out.println(include!!!);}else{System.out.println(noinclude!!!);}}}

如果str中有regEx,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Patternp=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);提取(从本例所给完整路径中提取文件名)

importjava.util.regex.*;publicclassRegexExample2{publicstaticvoidmain(String[]args){StringregEx=.+\\\\(.+)$;Stringstr=c:\\dir1\\dir2\\name.txt;Patternp=Pattern.compile(regEx);Matcherm=p.matcher(str);booleanrs=m.find();for(inti=1;i=m.groupCount();i++){System.out.println(m.group(i));//括号内匹配内容}}}

以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupCount();分割

importjava.util.regex.*;publicclassRegexExample3{publicstaticvoidmain(String[]args){StringregEx=::;Patternp=Pattern.compile(regEx);String[]r=p.split(xd::abc::cde);for(inti=0;ir.length;i++){System.out.println(r[i]);}}}

执行后,r就是{xd,abc,cde},其实分割时还有跟简单的方法:
Stringstr=xd::abc::cde;
String[]r=str.split(::);
替换(删除)

importjava.util.regex.*;publicclassRegexExample1{publicstaticvoidmain(String[]args){StringregEx=a+;//表示一个或多个aPatternp=Pattern.compile(regEx);Matcherm=p.matcher(aaabbcedaccdeaa);Strings=m.replaceAll(A);System.out.println(s);}}

结果为AbbcedAccdeA
如果写成空串,既可达到删除的功能,比如:
Strings=m.replaceAll();

0 评论:

发表评论