Java笔记之正则表达式

来源:互联网 发布:adobe破解软件使用 编辑:程序博客网 时间:2024/06/15 15:13

在一个许多文字的文本中查找你所需要的文字并不简单,但是正则表达式让查找字符变得非常优雅。

今天我们就来学一学Java的正则表达式。

第一步,介绍Java中如何利用上面的正则语法来构造正则表达式呢
看下面的例子

public static void main(String[] args) {        // 正则表达式        String regex = "";        // 编译正则表达式        Pattern pattern = Pattern.compile(regex);        // 被匹配的字符串        String str = "b";        // 设置被匹配的字符串        Matcher matcher = pattern.matcher(str);        // 匹配方式        // 全部匹配        if (matcher.matches()) {            // 如果匹配成功            System.out.println(str);        }     }

上面例子就是Java简单的使用正则表达式的过程。首先我们主要学习正则表达式的用法
第二步 学习正则表达式

常用的正则字符

字符     匹配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 的控制符 字符              匹配[abc]           a、b 或 c(简单类) [^abc]          任何字符,除了 a、b 或 c(否定) [a-zA-Z]        a 到 z 或 A 到 Z,两头的字母包括在内(范围) [a-d[m-p]]      a 到 d 或 m 到 p:[a-dm-p](并集) [a-z&&[def]]    d、e 或 f(交集) [a-z&&[^bc]]    a 到 z,除了 b 和 c:[ad-z](减去) [a-z&&[^m-p]]   a 到 z,而非 m 到 p:[a-lq-z](减去) [ ] 代表逻辑框 默认为或字符          匹配.       任何字符(与行结束符可能匹配也可能不匹配) \d      数字:[0-9] \D      非数字: [^0-9] \s      空白字符:[ \t\n\x0B\f\r] \S      非空白字符:[^\s] \w      单词字符:[a-zA-Z_0-9] \W      非单词字符:[^\w] ^       行的开头 $       行的结尾 \b      单词边界 \B      非单词边界 \A      输入的开头 \G      上一个匹配的结尾 \Z      输入的结尾,仅用于最后的结束符(如果有的话) \z      输入的结尾 X?      X,一次或一次也没有 X*      X,零次或多次 X+      X,一次或多次 X{n}    X,恰好 n 次 X{n,}   X,至少 n 次 X{n,m}  X,至少 n 次,但是不超过 m 次 X??     X,一次或一次也没有 X*?     X,零次或多次 X+?     X,一次或多次 X{n}?   X,恰好 n 次 X{n,}?  X,至少 n 次 X{n,m}? X,至少 n 次,但是不超过 m 次 X?+ X,一次或一次也没有 X*+ X,零次或多次 X++ X,一次或多次 X{n}+ X,恰好 n 次 X{n,}+ X,至少 n 次 X{n,m}+ X,至少 n 次,但是不超过 m 次 

做个小程序来说明使用正则表达式的步骤
目的从一个网页代码的文本文件中提取出链接出来

<td>172</td><td>0</td><td><a href='?t=lock&id=69260885' class='lock'>禁止评论</a></td><td><a href='/postedit/69260885'>编辑</a> | <a href='?t=top&id=69260885'>置顶</a> | <a href='?t=del&id=69260885' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69260885);' class='cat'>分类</a></td></tr><tr class='altitem'><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69259533' target=_blank>如何使用FastDFS上传图片</a><span class='gray'>(2017-04-13 22:34)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>170</td><td>0</td><td><a href='?t=lock&id=69259533' class='lock'>禁止评论</a></td><td><a href='/postedit/69259533'>编辑</a> | <a href='?t=top&id=69259533'>置顶</a> | <a href='?t=del&id=69259533' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69259533);' class='cat'>分类</a></td></tr><tr><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258951' target=_blank>数据结构与算法之高级排序(希尔/堆)&lt;十一&gt;</a><span class='gray'>(2017-04-09 15:53)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>98</td><td>0</td><td><a href='?t=lock&id=69258951' class='lock'>禁止评论</a></td><td><a href='/postedit/69258951'>编辑</a> | <a href='?t=top&id=69258951'>置顶</a> | <a href='?t=del&id=69258951' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258951);' class='cat'>分类</a></td></tr><tr class='altitem'><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258965' target=_blank>数据结构与算法之基础排序(冒泡/插入/选择)&lt;十&gt;</a><span class='gray'>(2017-04-09 15:51)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>99</td><td>0</td><td><a href='?t=lock&id=69258965' class='lock'>禁止评论</a></td><td><a href='/postedit/69258965'>编辑</a> | <a href='?t=top&id=69258965'>置顶</a> | <a href='?t=del&id=69258965' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258965);' class='cat'>分类</a></td></tr><tr><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258958' target=_blank>数据结构与算法之高级排序(快速/归并)&lt;十二&gt;</a><span class='gray'>(2017-04-09 15:50)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>106</td><td>0</td><td><a href='?t=lock&id=69258958' class='lock'>禁止评论</a></td><td><a href='/postedit/69258958'>编辑</a> | <a href='?t=top&id=69258958'>置顶</a> | <a href='?t=del&id=69258958' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258958);' class='cat'>分类</a></td></tr><tr class='altitem'><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258919' target=_blank>数据结构与算法之优先队列&lt;九&gt;</a><span class='gray'>(2017-04-07 17:55)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>110</td><td>0</td><td><a href='?t=lock&id=69258919' class='lock'>禁止评论</a></td><td><a href='/postedit/69258919'>编辑</a> | <a href='?t=top&id=69258919'>置顶</a> | <a href='?t=del&id=69258919' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258919);' class='cat'>分类</a></td></tr><tr><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258858' target=_blank>数据结构与算法之散列(分离链接法)&lt;七&gt;</a><span class='gray'>(2017-04-07 17:39)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>131</td><td>0</td><td><a href='?t=lock&id=69258858' class='lock'>禁止评论</a></td><td><a href='/postedit/69258858'>编辑</a> | <a href='?t=top&id=69258858'>置顶</a> | <a href='?t=del&id=69258858' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258858);' class='cat'>分类</a></td></tr><tr class='altitem'><td class='tdleft'><a href='http://blog.csdn.net/a609733301/article/details/69258910' target=_blank>数据结构与算法之散列(线性/平方/双平方探测法)&lt;八&gt;</a><span class='gray'>(2017-04-07 17:37)</span></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>116</td><td>0</td><td><a href='?t=lock&id=69258910' class='lock'>禁止评论</a></td><td><a href='/postedit/69258910'>编辑</a> | <a href='?t=top&id=69258910'>置顶</a> | <a href='?t=del&id=69258910' name=del>删除</a> | <a href='javascript:void(0);' onclick='javascript:return setcat(this,69258910);' class='cat'>分类</a></td></tr>

第一步确定正则表达式
分析过程

首先观察链接的格式    http://blog.csdn.net/a609733301/article/details/69258919根据需求找出不变的部分    这里为了使匹配稍微复杂点不设置不变得部分    因此可以初步确定格式    **://***.****.***/***/***/***/***    这样的格式    将变化的部分装化成正则表达式    一步一步来    首先根据需求来确定对各个变化部分是否有约束    为了复杂我尽量加点约束    我想匹配http或者https以及ftp这几种特定的首部    [(http)(https)(ftp)]    为了方便直接可以    \\w{3,5}+  至少三个不超过5个的字符  代表***    \\w{3,5}+://   代表**://    接下来对于网址    直接可以    (\\w+\\.)+  几个字符加上一个.的形式出现多次   代表***.****.    (\\w+/)+ 几个字符加上一个/的形式出现多次  代表 ***/***/          \\w+ 代表最后的几个字符 ***    最终正则表达式是    \\w{3,5}+://(\\w+\\.)+(\\w+/)+\\w+    对正则表达式进行优化(会使其更难与阅读)    \\w{3,5}+://(\\w+[\\./])+\\w+

确定好正则表达式后开始匹配

public static void main(String[] args) {    //获取指定匹配文件        File file = new File("F:/JavaCode/JavaResource/JavaSourceCode/src/test/text.txt");        //创建存储文件        File file1 = new File("F:/JavaCode/JavaResource/JavaSourceCode/src/test/text1.txt");        //创建存储字符串        StringBuffer stringBuffer = new StringBuffer();        //编译正则表达式        Pattern pattern = Pattern.compile("\\w{3,5}+://(\\w+[\\./])+\\w+");        try {            //文件读取对象            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));            //文件写入对象            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file1));            //读取文件直到末尾            while (bufferedReader.ready()) {                //一行一行的读                String readLine = bufferedReader.readLine();                //匹配这一行                Matcher matcher = pattern.matcher(readLine);                //匹配到结果                while (matcher.find()) {                    //将匹配的结果存入字符串中                    stringBuffer.append(matcher.group());                    stringBuffer.append('\n');                }            }            //将匹配字符存入文件            bufferedWriter.write(new String(stringBuffer));            bufferedReader.close();            bufferedWriter.close();        } catch (Exception e) {            e.printStackTrace();        } finally {        }    }结果http://blog.csdn.net/a609733301/article/details/69259533http://blog.csdn.net/a609733301/article/details/69258951http://blog.csdn.net/a609733301/article/details/69258965http://blog.csdn.net/a609733301/article/details/69258958http://blog.csdn.net/a609733301/article/details/69258919http://blog.csdn.net/a609733301/article/details/69258858http://blog.csdn.net/a609733301/article/details/69258910

总结
正则表达式的使用
1.首先是根据需求来确定匹配字符的不变与变化部分
2.将变化部分根据约束一步一步替换成正则表达式。
3.总表达式可以根据情况进行优化
提示
不可能一次就完美匹配到结果,较好的方法是先粗糙匹配,再逐渐细腻化。

1 0