Java正则表达式字符串匹配示例
Java正则表达式字符串匹配示例
xiaobo137 发表于1年前
Java正则表达式字符串匹配示例
  • 发表于 1年前
  • 阅读 23
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 这么多年,认识了很多同事,今天有个同事问我正则表达式怎么匹配,给了我需求。经过一系列的测试和调试解决问题。本文总结一下正则表达式的一些用法,不含参数细节,通过示例来说明正则表达式的编码实现

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

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

开始理解错误,我以为是要取出中间的那些内容,不包括"[标题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格式),里面对正则表达式的概念说的非常详细。

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

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

共有 人打赏支持
粉丝 35
博文 62
码字总数 31489
×
xiaobo137
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: