文档章节

Java正则表达式字符串匹配示例

xiaobo137
 xiaobo137
发布于 2016/07/13 13:03
字数 830
阅读 24
收藏 0

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

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

开始理解错误,我以为是要取出中间的那些内容,不包括"[标题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进行修改

过程如下(按顺序);

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格式),里面对正则表达式的概念说的非常详细。

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

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

© 著作权归作者所有

共有 人打赏支持
xiaobo137
粉丝 34
博文 64
码字总数 33309
作品 0
长沙
项目经理
java.util.regex Pattern 正则

/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法。学习了,瞬间觉得Pattern强大了 public String replaceAll(String regex, String replacement) {return Pat......

happycode
2014/04/02
0
1
js和java中正则表达式的易混淆点

js中正则表达式的使用 对表单中的值进行正则表达式匹配一般有两种方法: var reg = new RegExp(regStr); reg.test(value); 如下: var reg = new RegExp(“\d{3}”); reg.test(“abc123def”...

绝影jy
2014/07/30
0
0
Java利器——正则表达式详解!

  小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读。   前言   正则表达式是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换。许多语言...

恒生开发者社区
2017/03/14
0
0
Java 正则表达式功能及应用

正则表达式,就是用某种模式去匹配一类字符串的一个公式,正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,不管是...

浮躁的码农
2015/07/29
0
0
《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程

第15章 Kotlin 文件IO操作与多线程 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎...

程序员诗人
2017/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

5、前后端分离跨域问题

在以往的开发中,前后端分离也不是像现在这么热门,所谓的前端工程师也只不过是写好静态页面由Java工程师或者php工程师嵌入到页面中进行开发,这或许加重了这些工程师的工作量,而且在样式调...

永远的Chester
32分钟前
1
0
全志T3 Linux显示驱动分析

1、总体架构 全志T3处理器的显示框架是基于标准Linux的帧缓冲架构,其结构如图 1.1所示。显示控制器DE的驱动架构如图 1.2所示,包括屏蔽差异的显示管理抽象层,以及显示图层驱动、显示设备驱...

pnsam301
40分钟前
1
0
【HAVENT原创】VUE2 经验问题汇总

新建一个 Vue 实例可以有下列两种方式: 1. new 一个实例 var app= new Vue({ el:'#todo-app', // 挂载元素 data:{ // 在.vue组件中data是一个函数,要写成data () {}这种方式 i...

HAVENT
43分钟前
1
0
IO基础知识

读文件,可以使用内置的open(file,mode); with 语句自动close; 查看当前目录的绝对路径:os.path.abspath('.'); 创建目录:os.mkdir(path); 删除目录:os.rmdir(path); 拼接路径推荐使用:o...

年轻的中年大叔
46分钟前
0
0
BATJ等大厂最全经典面试题分享

金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、蚂蚁金服、小米、乐视、美团、58、...

老道士
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部