Java 正则表达式

本文详细介绍了Java正则表达式的使用方法,包括基础概念、Pattern类、String类及Matcher类的方法,深入讲解了字符类、量词、捕获组、边界匹配器等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.基础概念

1.1Character Classes

1.2Predefined Character Classes

1.3Quantifiers

1.4Capturing Groups

1.5Boundary Matchers

2.Pattern类的方法

3.String类的方法

4.Matcher类的方法

更详细的教程:Java tutorial 正则表达式篇


1.基础概念

正则表达式就是用一组用于描述字符串集合的常用字符。

JDK中支持正则表达式的API位于java.util.regex包下。

java.util.regex里的核心类为Pattern、Matcher。

Pattern设置正则表达式,Matcher设置需要匹配的文本。

 

 

1.1Character Classes

字符类用于匹配单个字符。

 

 

1.2Predefined Character Classes

java内置了一些预定义的字符类,可以省去我们自己定义的工作。

在使用预定义的字符类之前,需要使用\。

String REGEX = "\\d"; // a single digit

 

 

1.3Quantifiers

greedy量词修饰的字符会一次性匹配最高频率的字符,然后根据匹配需要,逐个退出,以寻找可以匹配完整pattern的字符串。

reluctant量词修饰的字符会从最低频率开始匹配字符,然后根据需要,逐渐增加匹配的字符数量,以寻找可以匹配完整pattern的字符串。

possessive量词修饰的字符会一次性匹配最高频率的字符,如果无法匹配完整pattern,也不会逐个退出。

 

 

1.4Capturing Groups

Capturing Croups的使用方法是,括号()。

eg:(abc)

使用Capturing Groups可以将多个字符作为一个单元使用。

 

一个正则表达式中的Capturing Groups的数量由正则表达式中的括号数量决定。

eg:(a(nc)(cc(s)))中有4个Capturing Groups

一个正则表达式中有多个Capturing Group时,Capturing Groups会被编号,编号的规则为从左到右,按照左括号出现的位置从1开始,依次编号。

可以使用\num的方法回调Capturing Groups,因为每一个匹配成果的Capturing Groups都会保存在内存中。

eg:(\d(\d(\d)))\2 可以匹配 12323。

 

1.5Boundary Matchers

边界映射用于控制映射发生的位置,eg:令映射发生在句首。

\b用来映射单词

eg:\bdog\b 可以映射 "a dog ."中的"dog",无法映射出"a doggsadf"中的"dog"

 

 

2.Pattern类的方法

Pattern用于设置正则表达式。

 

Pattern对象不能使用构造器直接获取,而是通过静态工厂方法compile来生成。

Pattern pattern = Pattern.compile("aaa");

note:创建一个正则表达式为"aaa"的Pattern对象。

 

使用Pattern标识(创建时)

可以在创建Pattern对象时,设置标志。

Pattern pattern = Pattern.compile(line, Pattern.CASE_INSENSITIVE);

 

使用Pattern标识(编写正则表达式时)

使用内置标识表达式编写正则表达式

eg:正则表达式:(?i)foo,输入字符串:"FOOfooFoOfoO",结果可以映射四次。

 

快速检测正则表达式与输入字符串是否对应

boolean flag = Pattern.matches("\\d", "111");

ps:输入的正则表达式与输入字符串必须完整匹配,eg:"\\d"与"111"返回false,"\\d{3}"与"111"返回true。

 

切分字符串

String[] items = pattern.split(INPUT);

 

将输入字符串转化为对应的字符串字面值正则表达式

String regex = Pattern.quote("111");

note:转化的字符串为"\Q111\E"。

 

获取Pattern对象中编辑的正则表达式

String regex = pattern.toString();

 

 

3.String类的方法

 

快速检测正则表达式与字符串是否对应

String index = "111";
boolean flag = index.matches("\\d{3}");

ps:此方法与Pattern.matches(regex, input)等价。

 

切分字符串

String input = "one2two"
String[] items = input.split("\\d", 0);

ps:该方法的第二个参数limit为一个int,用于设置映射次数,即设置为n时,使用正则表达式映射n-1次,最多得到n个子串。如果limit设置为负数或为zero,则得到最大切分结果。

 

切分字符串

String input = "one2two"
String[] items = input.split("\\d");

 

替换字符串中内容

String origin = "one1two";
String ans = origin.replace("1", " ");

note:得到字符串origin中"1"被替换成" "之后的新字符串,"one two"

ps:第一个参数target为字符串,而不是正则表达式。即这个方法与正则表达式没关系。

 

 

4.Matcher类的方法

Matcher对象不能使用构造器创建,应该使用已存在的Pattern对象的matcher方法获取。

Matcher matcher = pattern.matcher(line);

 

index方法

public int start():返回刚刚匹配到的字符串的首字符位置。

public int end():返回刚刚匹配到的字符串的尾字符之后的位置。

public int start(int group):返回刚刚匹配到的字符串中的指定group的首字符位置。

public int end(int group):返回刚刚匹配到的字符串中的指定group的尾字符之后的位置。

 

study方法

用于检阅输入字符串,并返回boolean类型值,判断匹配是否成功。

public boolean lookingAt():判断输入字符串首与正则表达式是否匹配。

public boolean matches():判断输入字符串与正则表达式是否完整匹配。

public boolean find():找寻一个与正则表达式匹配的子字符串,找到了返回true。ps:一般将此方法作为while循环的条件,用来遍历所有找到的子字符串。

public boolean find(int start):找寻一个与正则表达式匹配的子字符串,从start设置的index开始查找。

 

获取被匹配到的子字符串(String方法)

input.substring(matcher.start(), matcher.end());

获取被匹配到的子字符串(matcher方法)

matcher.group();

 

将输入字符串中的首个被匹配到的子字符串替换:

String ans = matcher.replaceFirst(replace);

ps:String的replaceFirst方法与之等价,源代码调用了此方法。

 

将输入字符串中的全部匹配子字符串替换:

String ans = matcher.replaceAll(replace);

ps:String的replaceAll方法与之等价,源代码调用了此方法。

 

public Matcher appendReplacement(StringBuffer sb, String replacement):

将输入字符串中被匹配到的子串添加到sb之中,然后将replacement继续添加到sb之后。此方法与find()类似,每一使用都会对下一次匹配执行。

 

public StringBuffer appendTail(StringBuffer sb):

将输入字符串中上一次匹配之后的字符全部添加进sb之中。此方法可以与appendReplacement方法搭配适合,达到replaceAll方法的效果。

while(matcher.find()) {
    matcher.appendReplacement(sb, replace);		
}
matcher.appendTail(sb);

 

 

 


更详细的教程:Java tutorial 正则表达式篇

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值