在java中使用正则表达式注意的地方
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中使用正则表达式注意的地方的更多相关文章
- JAVA中的正则表达式--待续
1.关于“\”,在JAVA中的正则表达式中的不同: 在其他语言中"\\"表示为:我想要在正则表达式中插入一个普通的反斜杠: 在Java中“\\”表示为:我想要插入一个正则表达式反斜 ...
- 9.JAVA中的正则表达式
一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ? #{0,1}-?有一个-或者没有 \\ #表示一个" ...
- java中使用正则表达式匹配字符串
在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...
- (转)Java中使用正则表达式的一个简单例子及常用正则分享
转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...
- 【java 正则表达式】记录所有在java中使用正则表达式的情况
本篇记录在java中邂逅正则表达式的所有美丽瞬间.因为在java和js中正则表达式的语法并不一致. 1.匹配字符串中有出现[2.1开头或者&2.1或者&3.1等的] Pattern m ...
- 译:Java 中的正则表达式性能概述
原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...
- java 中使用正则表达式操作字符串
import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFl ...
- java中的正则表达式捕获组与引用的概念
今天群里有个人问,怎样用增则表达式匹配三角形的三边,其实只是要匹配三个数字而已,如 301 402 503 开始认为很简单,我就写了一个 "(([1-9]\\d?)\\s){2}$2&q ...
- Java中书写要注意的地方
Java的命名规则:以字母.下划线(_)或$符号开头,其后跟任意数目的字母.数字.下划线和$符号. 注意: 数字不能作为标识符的开头: 除了下划线与$符号以外,其余的符号不能使用: 不能使用关键字作 ...
随机推荐
- PHP- 深入PHP、Redis连接
pconnect, phpredis中用于client连接server的api. The connection will not be closed on close or end of reques ...
- OkHttpUtils
对okhttp的封装类,okhttp见:https://github.com/square/okhttp.目前对应okhttp版本3.3.1. 用法: Android Studio compile ' ...
- wikioi 1202 求和(求n个数的和)
/*============================================================= 1202 求和 题目描述 Description 求n个数的和 输入描述 ...
- 重新加载maven项目的依赖项
最近在调试reportNG,测试允许完以后,报告总是使用的testNG的格式,并且只有index和overview两个文件. 找了好多帖子,大家都是那么设置的都没有问题,难道是哥人品不好?错! 大家基 ...
- Debian 环境下安装Tomcat记录
1.安装JAVA运行环境 Debian默认带了OpenJDK,有人说不好用,我没有验证就从ORACLE官网上下载了最新的JDK安装包,直接解压并设置环境变量就行了: # tar zxvf jdk-8u ...
- Struts2 - Study 1
领略下传说中的Struts2,写了个小例子,有点意思.比起.net中的MVC有意思的在于它是你自己一步步去配置实现,想怎么搞就怎么搞,.net的MVC,它干了什么事你完全不知,只不过知道怎么用而已. ...
- WIN7 清除任务栏图标缓存
如果任务栏上锁定程序如果换了位置,如:剪切走了.图标会变成白色图标. 解决方法: rem 关闭Windows外壳程序explorer taskkill /f /im explorer.exe rem ...
- log4net 部署到服务器之后 无法记录日志问题 解决方法
通常情况下无法记录日志的原因是:权限问题 1. 右键该站点的程序文件夹>>安全 2. 找到 IIS_IUSR 用户,然后编辑权限 允许修改,保存即可 3. 搞定
- 【NCDC数据】获取 hadoop权威指南3中的NCDC数据
vi getNcdcBigData.sh 内容如下: #!/bin/bash for i in {1901..2014} do cd /home/xxxx/hapood/ncdc wget --exe ...
- Maven 和 Ant 的区别?
Maven 和 Ant 有什么不同呢?在回答这个问题以前,首先要强调一点:Maven 和 Ant 针对构建问题的两个不同方面.Ant 为 Java 技术开发项目提供跨平台构建任务.Maven 本身描述 ...