一位之前的同事在群里面忽然发了个需求,要经过正则表达式来取值。给我发过来一张图,javascript
从图中能够出,需求是,经过下面的正则表达式,取出红色框所标示的内容java
开始理解错误,我觉得是要取出中间的那些内容,不包括"[标题BEGIN]"和“[标题END]”,因而写了下面的代码:正则表达式
private static void getStr(){ String str="[标题BEGIN]<#list>[@cms_chanel id=70]<li class=\"current\"></li>[/@cms_chanel]</#list>[标题END]"; Pattern p =Pattern.compile("\\[标题BEGIN\\](.*)\\[标题END\\]"); Matcher m =p.matcher(str); ArrayList<String> matches= new ArrayList<String>(); while(m.find()) { matches.add(m.group(1)); } for(String s: matches) { System.out.println("匹配结果:"+s); } }
回过头来一看需求,发现不对,因而再修改,主要是针对pattern进行修改code
过程以下(按顺序);ip
1. Pattern p =Pattern.compile("(\\[标题BEGIN\\](.*)\\[标题END\\])*");文档
输出结果:字符串
匹配结果:[标题BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li> [/@cms_chanel]</#list>[标题END]
匹配结果:nullget
第一个内容是咱们想要的结果,可是产生了两个结果,并且第二个是null,显然是不对的。class
当时猜测是(.*)匹配不到。因而有了下面的修改基础
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格式),里面对正则表达式的概念说的很是详细。
若是你对正则表达式比较熟悉的话,那么恭喜你,本文对你来讲没有任何难度了。
感谢全部曾经一块儿玩耍的小伙伴,是大家让我有了成长,让我一次次的进步,谢谢大家!