在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的命名规则:以字母.下划线(_)或$符号开头,其后跟任意数目的字母.数字.下划线和$符号. 注意: 数字不能作为标识符的开头: 除了下划线与$符号以外,其余的符号不能使用: 不能使用关键字作 ...
随机推荐
- 最大化 AIX 上的 Java 性能,第 1 部分: 基础
http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf1.html 最大化 AIX 上的 Java 性能,第 ...
- Font Awesome字体图标
1.什么是字体图标字体图标是一个包含许多图标的字体库.可以理解为一种特殊的字体,只不过里面包含的都是图标. 2.Font Awesome图标字体库Font Awesome是目前最受欢迎最全面的图标字体 ...
- C#判断文件及文件夹是否存在并创建(C#判断文件夹存在)
protected void Button1_Click(object sender, EventArgs e) { if (Directory.Exists(Server.MapPath(" ...
- Word快捷键
▲Word快捷键 [F1]键:帮助 [F2]键:移动文字或图形,按回车键确认 [F4]键:重复上一次的操作 [F5]键:编辑时的定位 [F6]键:在文档和任务窗格或其他Word窗格之间切换 [F8]键 ...
- ckeditor中“浏览服务器”的后台操作
此博文,基于CKeditor 4.5.6版本测试通过. 原创博文,转载请注明出处 参考官方文档,以及网络上的一些帖子.经过调试得到正确的期待中的结果. [网络上的一些所谓的帖子,不知道是故意将上传的代 ...
- github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.
- 71. Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...
- activiti基础操作
package activitiTest; import java.io.InputStream; import java.util.List; import java.util.zip.ZipInp ...
- 黄聪:使用WORDPRESS自带AJAX方法
例如给网站每页logo后面的一句名言,点击“换一条”就会ajax动态加载一条,使用了wordpress的自带ajax方法.下面介绍如何使用wordpress自带ajax方法: 1.在header.ph ...
- 解决pdm打开只显示表名不显示字段的步骤
解决pdm打开只显示表名不显示字段的方法 选中PDM 依次点击 工具-->显示参数选择-->content 下面的table ,右边勾选上columns 点击OK 选择 all symbo ...