在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的命名规则:以字母.下划线(_)或$符号开头,其后跟任意数目的字母.数字.下划线和$符号. 注意: 数字不能作为标识符的开头: 除了下划线与$符号以外,其余的符号不能使用: 不能使用关键字作 ...
随机推荐
- 【转】图解CSS的padding,margin,border属性(详细介绍及举例说明)
W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主要定义四个区域:内容(content).边框距(p ...
- 微信网页授权获取用户基本信息--PHP
现在就说说怎么通过网页授权获取用户基本信息(国家,省,市,昵称)等. 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用 ...
- maven 常见错误解决
1. maven打包编译时后台一直输出警告信息 [WARNING] File encoding has not been set, using platform encoding GBK, i.e. ...
- 邮件发送工具类 SendMail.java
package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- svn钩子(hooks)
首先你需要搭建出自己的svn环境出来,并能成功导入导出,并且了解svn,这是看这篇文章的前提.... 出于公司开发部需要svn同步更新服务器代码,需要用到svn钩子(hooks)技术,以前从来没听过, ...
- EditText使用详解-包含很多教程上看不到的功能演示
写道 标题有点大,说是详解,其实就是对EditText的一些常用功能的介绍,包括密码框,电话框,空白提示文字等等的讲解,尽量的介绍详细一点,也就是所谓的详解了..呵呵 广告一下我的应用“我团”,最新1 ...
- (转) 在Eclipse中进行C/C++开发的配置方法(20140721最新版)
本文转载自:http://blog.csdn.net/baimafujinji/article/details/38026421 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其 ...
- Winfrom DateGridView 实现Button列禁用
Form窗体如下所示: 实现如下: using System; using System.Collections.Generic; using System.Drawing; using System ...
- Eclipse无法进入Debug模式
转载自:http://blog.sina.com.cn/s/blog_4b3191950100v8h5.html 原因:多半是因为程序根本就没运行到断点处,所以重新检查自己设置的断点.