java 正则表达式 用法_Java 正则表达式用法总结二

Quantifiers 量词

指定匹配出现的次数。注:1)() 一组字符,并且关系;2){} 量词,出现次数;3)[]一组字符,或关系

X? 不匹配或一次匹配;

X+ 一次匹配或多次匹配;

X* 不匹配或多次匹配;

X{n} 匹配n次

X{n,} 匹配至少n次,无上限

X{n,m} 匹配至少n次,但不超过m次

例如:

表达式:a? 字符串:(空串) find返回true

表达式:(foo)+ 字符串:foo find返回true

表达式:(foo)* 字符串:(空串) find返回true

表达式:a{3,} 字符串:bbaaaaccc find返回true,group是aaaa

表达式:a{3,4} 字符串:bbaaaaaccc find返回true,group是aaaa;因为匹配次数需要满足至少3次,但不超过4次,所以匹配aaaa。

Greedy、Reluctant、Possessive量词的区别

Greedy 顾名思义贪婪,一次读入所有字符尝试第一次匹配。如果第一次匹配失败,则退后一个字符继续匹配,直到匹配成功,或者没有可以继续退后的字符停止。不加任何额外量词,以上例子默认就是Greedy量词。

Reluctant 和Greedy正相反。从开始一次读入一个字符进行匹配,直到最后匹配所有字符。后面加?量词修饰。

Possessive 和Greedy一样一次读入所有字符尝试匹配,但区别是只匹配一次,也是唯一的一次。不会像Greedy一样退后字符进行尝试匹配。后面加+量词修饰。

例如:

字符串:xfooxxxxxxfoo

1、表达式:.*foo(Greedy) find返回true,group是xfooxxxxxxfoo。

全部读入字符串;先匹配.*,全部匹配成功;接着匹配foo,逐字符退后读入字符匹配。

2、表达式:.*?foo(Reluctant)

find第一次返回true,group是xfoo;

find第二次返回true,group是xxxxxxfoo。

逐字符读入匹配正则表达式。

3、表达式:.*+foo(Possessive)find返回false

全部读入字符串;先匹配.*,全部匹配成功;接着匹配foo,因为所有字符已经匹配并且没有退后匹配机制,所以匹配不成功

Capturing Groups

Capturing Groups就是把多个字符作为一个单元,把多个字符放在一对()内。例如:

表达式:hi(hello)+(df)* 字符串:hihellohellodf

Capturing Groups的数量就是判断表达式一共有多少对()。其中组序号是从左向右进行划分,即:第1组(hello),第2组(df)。还有一个特殊的第0组,就是表达式本身hi(hello)+(df)*。

Matcher.groupCount()返回Capturing Groups的数量(不包括第0组)。因此上述例子的返回值是2。

Matcher.group(group)返回匹配成功的第group组字符串。

Matcher.group(0)同Matcher.group() 返回hihellohellodf;

Matcher.group(1) 返回hello;

Matcher.group(2) 返回df;

注意:若匹配成功,某一组没有子序列的话,返回null。

Backreferences \N后跟组号N,就是重复匹配第N组子序列。例如:

表达式:(\d\d)\1

1、字符串:1212 find返回true,group是1212。

(\d\d)表示匹配子序列12,\1重复匹配第一组子序列12。

2、字符串:1234 find返回false。

(\d\d)表示匹配子序列12,\1重复匹配第一组子序列12,后面的两个数字是34,所以不匹配。

Boundary Matchers 边界匹配

^ 起始限制,必须在行首

$ 结尾限制,必须在行尾

例如:

表达式:^88.* 字符串:88a find返回true。88在行首,后面是0到多个字符。

表达式:\s*dog$ 字符串: dog(前面3个空字符) find返回true。dog在行尾,前面是0到多个whitespace字符。

\b 限制word边界

\B 不限制word边界

例如:

表达式:\bdog\b 字符串:hello dog find返回true,group是dog。查找dog,前后边界约束,不得有whitespace意外的字符。

表达式:\Bdog\b 字符串:hellodog cc find返回true,group是dog。查找dog,前边界不约束,因为有\B,后边界约束。

\A 相当于^

\Z 相当于$,最后的终止符(如:\n)不在匹配之列

\z 匹配最后的所有字符

例如:

表达式:\Adog 字符串:dog hello find返回true。

表达式:dog\Z 字符串:abc dog\n find返回true。以dog结尾(不匹配终止符)。

表达式:dog\z 字符串:abc dog\n find返回false。字符串是以\n结尾,最后不是以dog结尾,所以不匹配。

\G 紧接着上一次匹配的后面进行匹配,直到不匹配为止。

例如:

表达式:\Gdog 字符串:dogdog dog

find第一次返回true,group是dog,start是0,end是3;

find第二次返回true,group是dog,start是3,end是6。

首先匹配第一个dog,然后紧接着上一次匹配的后面匹配第二个dog;第二个dog后面是空格,所以匹配结束,即使空格后面还有一个dog。使用场景:匹配多个相同子序列之间无其他字符干扰。

69d8df91240a69c46f74f03462b9dcc0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java正则表达式是一种用于匹配、查找和替换文本的强大工具。它可以用于验证输入是否符合特定的格式、从文本中提取信息、以及将文本中的某些内容替换成其他内容。 下面是一些示例代码,说明如何使用Java正则表达式进行匹配、替换和查找操作: 1. 匹配操作: ```java String input = "This is a test string."; String pattern = "test"; // 创建 Pattern 对象 Pattern p = Pattern.compile(pattern); // 执行匹配操作 Matcher m = p.matcher(input); if (m.find()) { System.out.println("Found match at index " + m.start() + " to " + m.end()); } else { System.out.println("No match found."); } ``` 这段代码首先定义了一个输入字符串和一个正则表达式模式,然后创建了一个 Pattern 对象,并使用该对象对输入字符串进行匹配操作。如果找到了匹配项,则输出其开始和结束位置;否则,输出未找到匹配项的提示信息。 2. 替换操作: ```java String input = "This is a test string."; String pattern = "test"; String replacement = "example"; // 执行替换操作 String output = input.replaceAll(pattern, replacement); System.out.println("Output string: " + output); ``` 这段代码使用了 String 类的 replaceAll() 方法,将输入字符串中所有匹配正则表达式模式的部分替换成指定的字符串。替换后的字符串将被输出到控制台。 3. 查找操作: ```java String input = "This is a test string."; String pattern = "\\w+"; // 创建 Pattern 对象 Pattern p = Pattern.compile(pattern); // 执行查找操作 Matcher m = p.matcher(input); while (m.find()) { System.out.println("Found match: " + m.group()); } ``` 这段代码使用了一个正则表达式模式,该模式匹配一个或多个字母、数字或下划线字符。然后,它创建了一个 Pattern 对象,并使用该对象对输入字符串进行查找操作。如果找到了匹配项,则输出其内容;否则,继续查找下一个匹配项。这里使用了 Matcher 类的 find() 方法来查找所有匹配项。 以上是Java正则表达式的一些基本用法,可以根据具体需求进行调整和扩展。通过学习Java正则表达式,我们可以更轻松地处理文本数据,并快速准确地完成各种文本处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值