博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java正则表达式字符串匹配示例
阅读量:6159 次
发布时间:2019-06-21

本文共 1802 字,大约阅读时间需要 6 分钟。

hot3.png

一位以前的同事在群里面突然发了个需求,要通过正则表达式来取值。给我发过来一张图,

从图中可以出,需求是,通过下面的正则表达式,取出红色框所标示的内容

开始理解错误,我以为是要取出中间的那些内容,不包括"[标题BEGIN]"和“[标题END]”,于是写了下面的代码:

private static void getStr(){		String str="[标题BEGIN]<#list>[@cms_chanel id=70]
  • [/@cms_chanel]
    [标题END]"; Pattern p =Pattern.compile("\\[标题BEGIN\\](.*)\\[标题END\\]"); Matcher m =p.matcher(str); ArrayList
    matches= new ArrayList
    (); while(m.find()) { matches.add(m.group(1)); } for(String s: matches) { System.out.println("匹配结果:"+s); } }

    回过头来一看需求,发现不对,于是再修改,主要是针对pattern进行修改

    过程如下(按顺序);

    1.  Pattern p =Pattern.compile("(\\[标题BEGIN\\](.*)\\[标题END\\])*");

         输出结果:

          匹配结果:[标题BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>  [/@cms_chanel]</#list>[标题END]

    匹配结果:null

          第一个内容是我们想要的结果,但是产生了两个结果,而且第二个是null,显然是不对的。

          当时猜想是(.*)匹配不到。于是有了下面的修改

    2. Pattern p =Pattern.compile("(\\[标题BEGIN\\].*\\[标题END\\])*");

         输出结果:

         匹配结果:[标题BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>[/@cms_chanel]</#list>[标题END]

    匹配结果:null

          这次注意到,最后面那个*没法匹配,null是这个*匹配出来的。于是修改如下

    3. Pattern p =Pattern.compile("(\\[标题BEGIN\\].*\\[标题END\\])");

        输出结果:

    匹配结果:[标题BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>[/@cms_chanel]</#list>[标题END]

     这就对了,是我们所需要的结果。

      也可以换成

      Pattern p =Pattern.compile("(\\[标题BEGIN\\](.*)\\[标题END\\])");

      效果是一样的。

     后来还发现一个问题,这样的话,如果包含回车换行的话(\n\r等),没法匹配到,于是查了点资料。

    这个问题有两个解决办法:

    1.设置pattern的模式为DOTALL

    2.使用正则表达式对字符串进行全部替换,表达式为: String reg = "(?s)'.*'";

     这里我们改写一下代码

     Pattern p =Pattern.compile("(\\[标题BEGIN\\](.*)\\[标题END\\])",Pattern.DOTALL);

    回车换行也能匹配了。

    解决了一个问题,学到了java的正则表达式使用方法,这可能只是java关于正则的冰山一角,也许还有其他更好用得方法,如果今后有发现,再补充进来。

    也许你对正则表达式还不是那么熟悉,那么我建议你先学好一些基础再来看本文。推荐看一看微软javascript的说明文档(chm格式),里面对正则表达式的概念说的非常详细。

    如果你对正则表达式比较熟悉的话,那么恭喜你,本文对你来说没有任何难度了。 

    感谢所有曾经一起玩耍的小伙伴,是你们让我有了成长,让我一次次的进步,谢谢你们!

    转载于:https://my.oschina.net/u/2457585/blog/711042

    你可能感兴趣的文章
    登记申请汇总
    查看>>
    Android Jni调用浅述
    查看>>
    CodeCombat森林关卡Python代码
    查看>>
    第一个应用程序HelloWorld
    查看>>
    (二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
    查看>>
    Shell基础之-正则表达式
    查看>>
    JavaScript异步之Generator、async、await
    查看>>
    讲讲吸顶效果与react-sticky
    查看>>
    c++面向对象的一些问题1 0
    查看>>
    售前工程师的成长---一个老员工的经验之谈
    查看>>
    Get到的优秀博客网址
    查看>>
    老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
    查看>>
    Python学习--time
    查看>>
    在OSCHINA上的第一篇博文,以后好好学习吧
    查看>>
    Spring常用注解
    查看>>
    linux:yum和apt-get的区别
    查看>>
    Sentinel 1.5.0 正式发布,引入 Reactive 支持
    查看>>
    数据库之MySQL
    查看>>
    2019/1/15 批量删除数据库相关数据
    查看>>
    数据类型的一些方法
    查看>>