1、 对^与$的理解

通常我们会通过类似Matcher matcher = Pattern.compile(regex).matcher(string);的代码去拿到一个Matcher对象。
这种情况下regex中的^与$匹配的是整个待匹配串string的开头与结尾。
而要使^与$去匹配每一行的开始与结尾,则要使用Pattern.MULTILINE。即:Matcher matcher = Pattern.compile(regex, Pattern.MULTILINE).matcher(string);

看下面的几个例子:

        String inputStr = "stg换行前\r\n换stg行后";
System.out.println("-----------------");
System.out.println(inputStr);
System.out.println("-----------------");
Matcher matcher = Pattern.compile(".*stg.*").matcher(inputStr);
while(matcher.find()){
System.out.println("start-" + matcher.start());
System.out.println("end-" + matcher.end());
System.out.println("matches-" + matcher.group());
}

匹配结果:

-----------------
stg换行前
换stg行后
-----------------
start-0
end-6
matches-stg换行前
start-8
end-14
matches-换stg行后

如果我们将正则换成"^.*stg.*",则只能匹配到一次:

        String inputStr = "stg换行前\r\n换stg行后";
System.out.println("-----------------");
System.out.println(inputStr);
System.out.println("-----------------");
Matcher matcher = Pattern.compile("^.*stg.*").matcher(inputStr);
while(matcher.find()){
System.out.println("start-" + matcher.start());
System.out.println("end-" + matcher.end());
System.out.println("matches-" + matcher.group());
}

匹配结果:

-----------------
stg换行前
换stg行后
-----------------
start-0
end-6
matches-stg换行前

如果将正则换成".*stg.*$",也只能得到一次匹配:

        String inputStr = "stg换行前\r\n换stg行后";
System.out.println("-----------------");
System.out.println(inputStr);
System.out.println("-----------------");
Matcher matcher = Pattern.compile(".*stg.*$").matcher(inputStr);
while(matcher.find()){
System.out.println("start-" + matcher.start());
System.out.println("end-" + matcher.end());
System.out.println("matches-" + matcher.group());
}

匹配结果:

-----------------
stg换行前
换stg行后
-----------------
start-8
end-14
matches-换stg行后

如果我们将正则换成:"^.*stg.*$",将得不到任何匹配。因为.(点)匹配不到换行符(.匹配的是除换行符以外的任意字符)。

        String inputStr = "stg换行前\r\n换stg行后";
System.out.println("-----------------");
System.out.println(inputStr);
System.out.println("-----------------");
Matcher matcher = Pattern.compile("^.*stg.*$").matcher(inputStr);
while(matcher.find()){
System.out.println("start-" + matcher.start());
System.out.println("end-" + matcher.end());
System.out.println("matches-" + matcher.group());
}

匹配结果:

-----------------
stg换行前
换stg行后
-----------------

如果要让^与$匹配每行的开始与结束,则要将代码改成:Pattern.compile("^.*stg.*$", Pattern.MULTILINE).matcher(inputStr);

        String inputStr = "stg换行前\r\n换stg行后";
System.out.println("-----------------");
System.out.println(inputStr);
System.out.println("-----------------");
Matcher matcher = Pattern.compile("^.*stg.*$", Pattern.MULTILINE).matcher(inputStr);
while(matcher.find()){
System.out.println("start-" + matcher.start());
System.out.println("end-" + matcher.end());
System.out.println("matches-" + matcher.group());
}

匹配结果:

-----------------
stg换行前
换stg行后
-----------------
start-0
end-6
matches-stg换行前
start-8
end-14
matches-换stg行后

2、注意eclipse里的换行是 \R  ,而不是我们常规使用的 \r  。

例:

(<dubbo:)(reference|service)((.|\R)*?)(com\.ihome\.trust)((.|\R)*?)(/>)
$1$2$3$5$6 version="0.0.1" $8

如果想系统的学习正则表达式,请移步我的 正则表达式从入门到高手 的视频课程:
http://edu.51cto.com/sd/59587

在java中使用正则表达式注意的地方的更多相关文章

  1. JAVA中的正则表达式--待续

    1.关于“\”,在JAVA中的正则表达式中的不同: 在其他语言中"\\"表示为:我想要在正则表达式中插入一个普通的反斜杠: 在Java中“\\”表示为:我想要插入一个正则表达式反斜 ...

  2. 9.JAVA中的正则表达式

    一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ?          #{0,1}-?有一个-或者没有 \\           #表示一个" ...

  3. java中使用正则表达式匹配字符串

    在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...

  4. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  5. 【java 正则表达式】记录所有在java中使用正则表达式的情况

    本篇记录在java中邂逅正则表达式的所有美丽瞬间.因为在java和js中正则表达式的语法并不一致. 1.匹配字符串中有出现[2.1开头或者&2.1或者&3.1等的] Pattern m ...

  6. 译:Java 中的正则表达式性能概述

    原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...

  7. java 中使用正则表达式操作字符串

    import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFl ...

  8. java中的正则表达式捕获组与引用的概念

    今天群里有个人问,怎样用增则表达式匹配三角形的三边,其实只是要匹配三个数字而已,如 301 402 503 开始认为很简单,我就写了一个   "(([1-9]\\d?)\\s){2}$2&q ...

  9. Java中书写要注意的地方

    Java的命名规则:以字母.下划线(_)或$符号开头,其后跟任意数目的字母.数字.下划线和$符号.  注意: 数字不能作为标识符的开头: 除了下划线与$符号以外,其余的符号不能使用: 不能使用关键字作 ...

随机推荐

  1. PHP- 深入PHP、Redis连接

    pconnect, phpredis中用于client连接server的api. The connection will not be closed on close or end of reques ...

  2. OkHttpUtils

    对okhttp的封装类,okhttp见:https://github.com/square/okhttp.目前对应okhttp版本3.3.1. 用法: Android Studio compile ' ...

  3. wikioi 1202 求和(求n个数的和)

    /*============================================================= 1202 求和 题目描述 Description 求n个数的和 输入描述 ...

  4. 重新加载maven项目的依赖项

    最近在调试reportNG,测试允许完以后,报告总是使用的testNG的格式,并且只有index和overview两个文件. 找了好多帖子,大家都是那么设置的都没有问题,难道是哥人品不好?错! 大家基 ...

  5. Debian 环境下安装Tomcat记录

    1.安装JAVA运行环境 Debian默认带了OpenJDK,有人说不好用,我没有验证就从ORACLE官网上下载了最新的JDK安装包,直接解压并设置环境变量就行了: # tar zxvf jdk-8u ...

  6. Struts2 - Study 1

    领略下传说中的Struts2,写了个小例子,有点意思.比起.net中的MVC有意思的在于它是你自己一步步去配置实现,想怎么搞就怎么搞,.net的MVC,它干了什么事你完全不知,只不过知道怎么用而已. ...

  7. WIN7 清除任务栏图标缓存

    如果任务栏上锁定程序如果换了位置,如:剪切走了.图标会变成白色图标. 解决方法: rem 关闭Windows外壳程序explorer taskkill /f /im explorer.exe rem ...

  8. log4net 部署到服务器之后 无法记录日志问题 解决方法

    通常情况下无法记录日志的原因是:权限问题 1. 右键该站点的程序文件夹>>安全 2. 找到 IIS_IUSR 用户,然后编辑权限 允许修改,保存即可 3. 搞定

  9. 【NCDC数据】获取 hadoop权威指南3中的NCDC数据

    vi getNcdcBigData.sh 内容如下: #!/bin/bash for i in {1901..2014} do cd /home/xxxx/hapood/ncdc wget --exe ...

  10. Maven 和 Ant 的区别?

    Maven 和 Ant 有什么不同呢?在回答这个问题以前,首先要强调一点:Maven 和 Ant 针对构建问题的两个不同方面.Ant 为 Java 技术开发项目提供跨平台构建任务.Maven 本身描述 ...