正则表达式-Java
目录
文章目录
内容
1、java.util.regex包
Java把处理正则相关的类放在此包中主要用到的类Pattern 和Matcher。
1.1、Pattern
public final class Pattern
extends Object
implements Serializable
正则表达式的编译表示。
-
使用步骤:
- 必须首先将正则表达式(指定为字符串)编译为此类的实例。
- 然后将所得的图案可以被用来创建一个Matcher对象可以匹配任意character sequences针对正则表达式。
- 执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式。
-
示例:因此,典型的调用序列
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
这个类定义了一个matches方法,以便在正则表达式只使用一次时方便。 该方法编译一个表达式,并在单个调用中匹配输入序列。 该声明
boolean b = Pattern.matches("a*b", "aaaaab");
相当于上面的三个语句,尽管对于重复匹配,它的效率较低,因为它不允许编译的模式被重用。
这个类的实例是不可变的,可以安全地被多个并发线程使用。 该实例Matcher类不适合这样的使用是安全的。
- 常用属性:给定标识
修饰符 | 属性名 | 描述 |
---|---|---|
static int | CASE_INSENSITIVE | 启用不区分大小写的匹配。 |
static int | DOTALL | "."点号可以匹配所有字符 |
static int | MULTILINE | 启用多行模式。 |
- 常用方法
修饰符 | 返回值类型 | 方法名 | 参数列表 | 描述 |
---|---|---|---|---|
static | Pattern | compile | String regex | 将给定的正则表达式编译为模式。 |
static | Pattern | compile | String regex, int flags | 将给定的正则表达式编译为带有给定标志的模式。 |
Matcher | matcher | CharSequence input | 创建一个匹配器,匹配给定的输入与此模式。 |
1.2、Matcher
public final class Matcher
extends Object
implements MatchResult
Matcher通过Pattren匹配给定的输入(目标字符串)创建的匹配器,通过匹配器的相关方法得到我们想要的结果。
- 常用方法
修饰符 | 返回值类型 | 方法名 | 参数列表 | 描述 |
---|---|---|---|---|
boolean | matches | 尝试将整个区域与模式进行匹配。 | ||
boolean | lookingAt | 尝试将输入序列从区域开头开始与模式相匹配。 | ||
boolean | find | 尝试找到匹配模式的输入序列的下一个子序列 | ||
String | group | 返回与上一个匹配匹配的输入子序列。 | ||
String | group | int group | 返回在上一次匹配操作期间由给定组捕获的输入子序列。 | |
String | group | String name | 返回给定捕获的输入子序列 named-capturing group以前的匹配操作期间。 | |
int | groupCount | 返回此匹配器模式中捕获组的数量。 | ||
String | replaceAll | String replacement | 将与模式匹配的输入序列的每个子序列替换为给定的替换字符串 | |
String | replaceFirst | String replacement | 将与模式匹配的输入序列的第一个子序列替换为给定的替换字符串。 | |
- 使用步骤(详细)
- 执行上匹配操作的引擎character sequence通过解释Pattern 。
- 通过调用模式的matcher方法从模式创建匹配器。
- 创建后,可以使用匹配器执行三种不同类型的匹配操作:
-
- 查找
- matches:从开头匹配所有
- lookingAt:从开头尝试匹配(并不一定匹配所有)
- find:匹配所有(不要求从开始就匹配)
-
- 获取
- group(空参):默认匹配下一个
- group(参数)
- 分组序号:0
- 0 :所有分组
- 1:第一个分组
- …
- 分组名称(自定义分组名)
- 分组序号:0
-
- 替换
- replaceAll:用给定的字符序列替换所有匹配到的字符序列,返回替换后的字符序列
- replaceFirst:用给定的字符序列替换第一个匹配到的字符序列,返回替换后的字符序列
-
2、案例
2.1、匹配IP地址、子网掩码、默认网关并输出
cmd命令窗口获取IP相关信息:window-ipconfig Linux-ifconfig,以windows为例,内容如下:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a83e:1aaa:fb33:4b19%7
IPv4 地址 . . . . . . . . . . . . : 192.168.43.181
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.43.37
-
示例代码2.1-1:
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestIP { public static void main(String[] args) { String ipTxt = "连接特定的 DNS 后缀 . . . . . . . :\r\n" + "本地链接 IPv6 地址. . . . . . . . : fe80::a83e:1aaa:fb33:4b19%7\r\n" + "IPv4 地址 . . . . . . . . . . . . : 192.168.43.181\r\n" + "子网掩码 . . . . . . . . . . . . : 255.255.255.0\r\n" + "默认网关. . . . . . . . . . . . . : 192.168.43.37"; String regex = "\\d+\\.\\d+\\.\\d+\\.\\d+"; Matcher matcher = Pattern.compile(regex, Pattern.MULTILINE).matcher(ipTxt); while(matcher.find()) { String ip = matcher.group(); System.out.println(ip); } } } 测试结果: 192.168.43.181 255.255.255.0 192.168.43.37
2.2、把匹配到的字符串替换为另外一个字符串
-
示例2.2-1:把“吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮”中的葡萄替换为“核桃”
-
解法1:利用String类的replace方法
-
解法2:利用Matcher的replaceAll方法
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegexReplace { public static void main(String[] args) { String str = "吃葡萄不吐葡萄皮 不吃葡萄倒吐葡萄皮"; String target = str.replace("葡萄", "核桃"); System.out.println(target); Matcher matcher = Pattern.compile("葡萄").matcher(str); String target1 = matcher.replaceAll("核桃"); System.out.println(target1); } } 测试结果: 吃核桃不吐核桃皮 不吃核桃倒吐核桃皮 吃核桃不吐核桃皮 不吃核桃倒吐核桃皮
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA