Java语言中的正则表达式
正则表达式是什么?
正则表达式是一种强大而灵活的文本处理工具。初学正则表达式时,其语法是一个难点,但它确实是一种简洁、动态的语言。正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、选择、编辑以及验证。一般来说,正则表达式就是以某种方式来描述字符串。
日常例子
在文本中查找“halu126”,我们通常会在查找框中输入“halu126”,这就是一个最简单的正则表达式的例子,使用精确的匹配这样的字符串,如果我 们即想在文本中找到“halu126”,又想找到“Halu126”,却不想找到“aaaHalu126bbbb”中的“Halu126”,该怎么办?
在linux中我们想查想列出所有的Java源文件,通常会在终端中输入:ls -all *.java,其中“*”是叫做通配符,而正则表达式比通配符更牛,它能更精确的描述你的需求。
正则表达式的构造摘要
| 构造 | 匹配 |
|---|---|
| 字符 | |
| X | 字符X |
| \\\\ | 反斜线字符 |
| \t | 制表符 |
| \n | 换行符 |
| \r | 回车符 |
| 字符类 | |
| [abc] | a、b 或 c(简单类) |
| [^abc] | 任何字符,除了 a、b 或 c(否定) |
| [a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
| [a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
| [a-z&&[def]] | d、e 或 f(交集) |
| [a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
| 预定义字符类 | |
| . | 任何字符 |
| \d | 数字:[0-9] |
| \D | 非数字:[^0-9] |
| \s | 空白字符:[\t\n\x0B\f\r] |
| \S | 非空白字符:[^\s] |
| \w | 单词字符:[a-zA-Z_0-9] |
| \W | 非单词字符:[^\w] |
| 边界匹配器 | |
| ^ | 行的开头 |
| $ | 行的结尾 |
| \b | 单词边界 |
| \B | 非(单词边界) |
| 量词 | |
| X? | X,一次或一次也没有 |
| X* | X,零次或多次 |
| X+ | X,一次或多次 |
| X{n} | X,恰好n次 |
| X{n,} | X,至少n次 |
| X{n,m} | X,至少n次,但是不超过m次 |
| Logical运算符 | |
| XY | X后跟Y |
| X|Y | X或者Y |
| (X) | X,作为捕获组 |
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式中((A)(B(C)))中,存在四个这样的组
| 1 | ((A)(B(C))) |
| 2 | (A) |
| 3 | (B(C)) |
| 4 | (C) |
Java语言中正则表达式的不同处
在其他语言中,“
\\”表示“我想在正则表达式中插入一个普通的(字面上的)反斜线,请不要给它任何特殊的意义。”在Java语言中,“\\”表示“我要插入一个正则表达
式的反斜线,所以其后的字符具有特殊的意思。”例如:“\\d”表示Java语言中正则表达式的一位数字。“\\\\”表示一个普通的反斜线。不过换行和
制表符之类的东西只需要使用单反斜线:“\n\t”。
量词的类型:
量词:描述了一个模式吸收(匹配)输入文本的方式,也叫做重复限定符。
贪婪型:量词总是贪婪的,除非有其他的选项被设定。贪婪表达式会为所有可能的模式发现尽可能多的匹配。
勉强型:用问号指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的、最少匹配的、非贪婪的、或不贪婪的。
占有型:Java中独有的。其他语言没有。当正则表达式被应用于字符序列时,它会产生相当多的状态,以便在匹配失败时可以回溯。而“占有的”量词并不保存这些中间状态,因此他们可以防止回溯。他们常常用于防止正则表达式失控,因此可以使正则表达式执行起来更有效。
| Greedy数量词 | Reluctant数量词 | Possessive数量词 |
|---|---|---|
| X? | X?? | X?+ |
| X* | X*? | X*+ |
| X+ | X+? | X++ |
| X{n} | X{n}? | X{n}+ |
| X{n,} | X{n,}? | X{n,}+ |
| X{n,m} | X{n,m}? | X{n,m}+ |
量词作用的表达式通常必须要使用圆括号括起来。
String类中使用正则表达式的方法
matches(String regex)
split(String regex)
split(String regex, int limit)
replaceFirst(String regex, String replacement)
repalceAll(String regex, String replacement)
Java语言中表示正则表达式的类
在Java语言中与正则表达式相关的类都放在java.util.regex包。
- *Pattern类:*pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
- *Matcher类:*Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
- *PatternSyntaxException:*PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern pattern = Pattern.compile("a*b");
Matcher matcher= pattern("aaaaaaab");
matcher.XXX();
一个简单的代码如下:
public class TestRegularExpression {
public static void main(String[] args) {
if(args.length < 2) {
print("Usage:\njava TestRegularExpression " +
"characterSequence regularExpression+");
System.exit(0);
}
print("Input: \"" + args[0] + "\"");
for(String arg : args) {
print("Regular expression: \"" + arg + "\"");
Pattern p = Pattern.compile(arg);
Matcher m = p.matcher(args[0]);
while(m.find()) {
print("Match \"" + m.group() + "\" at positions " +
m.start() + "-" + (m.end() - 1));
}
}
}
}
Pattern和Matcher类中常用的方法
//使用Pattern类的静态方法compile来编译正则表达式,它会根据正则表达式regex生成一个Pattern对象。
Pattern pattern = Pattern.compile(String regex)
//检查regex是否匹配整个CharSequence类型的input参数
Pattern.matches(String regex, CharSequence input)
//从匹配了regex的地方分割输入字符序列input
pattern.split(CharSequence input)
//同String.split()
pattern.split(CharSequence input, int limit)
//根据模板pattern生成input的匹配器matcher
Matcher matcher = pattern.matcher(CharSequence input);
//从字符序列的开始位置(0位字符)迭代的向前遍历字符序列,找到匹配模式的部分
matcher.find()
//从字符序列的第start位字符开始(以第start位字符作为搜索的起点)迭代的向前遍历字符序列,找到匹配模式的部分
matcher.find(int start)
//判断整个输入字符序列是否匹配正则表达式模式
matcher.matches()
//判断该字符序列(不必是整个字符序列)的开始部分是否能够匹配模式
matcher.lookingAt()
//该匹配器的模式中的分组数目
matcher.groupCount()
//返回前一次匹配操作(例如find())的第0组(即整个匹配)
matcher.group()
//返回在前一次操作期间指定的组号,如果没有指定的组,返回null
matcher.group(int group)
//
matcher.start()
//返回前一次匹配操作中寻找到的组的起始索引
matcher.start(int group)
matcher.end()
//返回前一次匹配操作中寻找到的组的最后一个字符索引加一的值
matcher.end(int group)
//将matcher对象重新设置到当前字符序列的起始位置
matcher.reset()
将现有的matcher对象应用到一个新的字符序列
matcher.reset(CharSequence input)
使用正则表达式时要注意的事儿
要匹配一种情况,我们可以写出多个可行的正则表达式,当然了,我们的目的并不是编写最难理解的正则表达式,而是尽量编写能够完成任务的、最简单以及最必要的正则表达式。
参考
- Java编程思想
- JDK API文档
- 正则表达式30分钟入门教程
- RUNOOB中关于正则表达式的介绍
Java语言中的正则表达式的更多相关文章
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- JAVA语言中冒号的用法
近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- Java语言中的异常处理
Java语言中的异常处理包括声明异常.抛出异常.捕获异常和处理异常四个环节. throw用于抛出异常. throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异 ...
- 列举java语言中反射的常用方法
package review;/*12:43 2019/7/21*/ import model.AnotherClass; import model.OneClassMore; import mode ...
- Java语言中使用OpenMP
从去年年中,开始学习Java,主要是维护公司用Java编写的服务器软件.目前,该服务器软件遇到一个问题,在下载大文件时,如果同时下载的用户很多, 服务器软件工作会出现异常,有的用户无法下载.服务器硬件 ...
- Java语言中的这些知识点有没有用过,工作中有没有入过这些坑?
在Java语言中,有一些相对生僻的知识,平时用的机会可能不是很多,但如果不了解不掌握这些知识点的话,也可能会掉入陷阱之中,今天我们就来初步梳理一下: 1. goto是java语言中的关键字. &quo ...
- Java语言中的访问权限修饰符
一个Java应用有很多类,但是有些类,并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语 ...
随机推荐
- 如何设置单个 Git 仓库的代理从而提高更新速度
如何设置单个 Git 仓库的代理从而提高更新速度 因为特殊原因,需要单独对 Git 仓库设置远程代理,从而提高更新速度. 主要原因是因为有一些远程 Git 仓库比较慢. 最初的想法是系统全局代理,但是 ...
- tyvjP1288 飘飘乎居士取能量块
P1288 飘飘乎居士取能量块 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 9月21日,pink生日:9月22日,lina生日:9月23日,轮到到飘飘乎居 ...
- Hashkell 第一篇
心情极差.................. 无事可做,其实是没心情去做事情,只好又翻起了haskell入门 记下几点,以备查询: 1. 函数名首字符是不可以大写的, 而且名称中可以有单引号,这也是合 ...
- php的模板原理
下载了开源论坛phpbb的代码,突然对php模板初步了解了一下: php与Html在一起编写真的是很烦人,所以必须要把数据计算以及显示格式分离,这就需要模板来实现了. http://baike.bai ...
- 高速求幂 POW优化
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27633731 #include <io ...
- day39-Spring 18-Spring的JDBC模板:查询的操作
package cn.itcast.spring3.demo2; import java.sql.ResultSet; import java.sql.SQLException; import jav ...
- python 字符串匹配算法设计
- mysql锁机制之行锁(四)
前言 顾名思义,行锁就是一锁锁一行或者多行记录,mysql的行锁是基于索引加载的,所以行锁是要加在索引响应的行上,即命中索引,如下图所示: InnoDB 支持多粒度锁(multiple granula ...
- Effective Modern C++:02auto
05:优先使用auto,而非显示类型声明 显示类型声明有下面一些缺点: int x; //未初始化,或者初始化为0,视语境而定 template<typename It> void dwi ...
- 【JZOJ1922】【Usaco 2005 NOV Gold】小行星群
题目描述 Bessie想驾驶她的飞船穿过危险的小行星群,小行星群是一个N×N的网格(1 <= N <= 500),在网格内有K个小行星(1 <= K <= 10,000). 幸 ...