Java正则表达式应用总结

发表于:2009-7-20 10:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

#
java

  一、概述

  正则表达式是Java处理字符串、文本的重要工具。

  Java对正则表达式的处理集中在以下两个两个类:

  java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。

  java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。

  (很遗憾,Java Doc并没有给出这两个类的职责概念。)

  比如一个简单例子:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* 正则表达式例子 
* 
* @author leizhimin 2009-7-17 9:02:53 
*/
 
public class TestRegx { 
        public static void main(String[] args) { 
                Pattern p = Pattern.compile("f(.+?)k"); 
                Matcher m = p.matcher("fckfkkfkf"); 
                while (m.find()) { 
                        String s0 = m.group(); 
                        String s1 = m.group(1); 
                        System.out.println(s0 + "||" + s1); 
                } 
                System.out.println("---------"); 
                m.reset("fucking!"); 
                while (m.find()) { 
                        System.out.println(m.group()); 
                } 

                Pattern p1 = Pattern.compile("f(.+?)i(.+?)h"); 
                Matcher m1 = p1.matcher("finishabigfishfrish"); 
                while (m1.find()) { 
                        String s0 = m1.group(); 
                        String s1 = m1.group(1); 
                        String s2 = m1.group(2); 
                        System.out.println(s0 + "||" + s1 + "||" + s2); 
                } 

                System.out.println("---------"); 
                Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])"); 
                Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31"); 
                while (m3.find()) { 
                        System.out.println(m3.group()); 
                } 
        } 
}

  输出结果:

fck||c 
fkk||k 
--------- 
fuck 
finish||in||s 
fishfrish||ishfr||s 
--------- 
1900-01-01 
2007/08/13 
1900.01.01 
1900 01 01 
1900 02 31 

Process finished with exit code 0

  二、一些容易迷糊的问题

  1、Java对反斜线处理的问题

  在其他语言中,\\表示要插入一个字符\;

  在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。

  看API文档:

  预定义字符类

  . 任何字符(与行结束符可能匹配也可能不匹配)

  \d 数字:[0-9]

  \D 非数字: [^0-9]

  \s 空白字符:[ \t\n\x0B\f\r]

  \S 非空白字符:[^\s]

  \w 单词字符:[a-zA-Z_0-9]

  \W 非单词字符:[^\w]

  但是看看上面程序,对比下不难看出:

  \d在实际使用的时候就写成了 \\d;

  在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\\\,原因是下面的APIDoc定义\\表示一个反斜线。

  但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.

  字符

  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 的控制符

  2、Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。

  3、Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用

  Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。

  或者Matcher.reset(CharSequence input)  重置此具有新输入序列的匹配器。

  来重复使用匹配器。

21/212>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • janewash
    2009-7-20 16:05:27

    java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。
    java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。

    中英文是不是没匹配上??

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号