复习:正则表达式
Pattern pattern = Pattern.compile("\\d+");
传入的参数就是字符串格式的正则表达式。
注意pattern的编译是一个比较消耗性能的操作,尽可能的一次编译多次使用!
matcher对象又要通过pattern对象获得
Matcher matcher = pattern.matcher(target);传入的参数就是要匹配的字符串,比如:
String target = "666";
if (matcher.matches()) { System.out.println("matched……");
演示:将targe换成:
String target = "hello, 源栈,加油2022!O(∩_∩)O哈哈~,666";
while (matcher.find()) { System.out.println("matcher.start():"+ matcher.start()); System.out.println("matcher.start():"+ matcher.end()); }
start()和end()可以获取查找到的字符串所在的起始位置。
还可以直接进行替换:
System.out.println(matcher.replaceFirst("xxx")); System.out.println(matcher.replaceAll("xxx"));
但如果我要查看查找/匹配到的字符串怎么办?使用group()方法:
while (matcher.find()) { System.out.println(matcher.group()); }
Pattern pattern = Pattern.compile("(\\d)\\1"); System.out.println(matcher.group(1));
Pattern pattern = Pattern.compile("(?<digit>\\d)\\k<digit>"); System.out.println(matcher.group("digit"));
有了group之后,replaceXXX()的参数就可以使用$开头(后接分组序号或名字)的字符串表示分组:
System.out.println(matcher.replaceFirst("$1")); System.out.println(matcher.replaceAll("${digit}"));
很多时候,我们需要大量的、带条件(比如数字能被3整除)的替换:
while (matcher.find()) { if (Integer.valueOf(matcher.group())%3==0) { //怎么办??? }
这样是不行的:
result = matcher.replaceAll("(3n)");注意:replaceFirst()和replaceAll()都会重置(reset)matcher……,形成死循环!
只能使用matcher.appendReplacement()方法:
StringBuffer sb = new StringBuffer();
matcher.appendReplacement(sb, replaced);
matcher.appendTail(sb);
String target = "hello, 源栈,加油2022!(666,赞……)大飞哥英俊潇洒风流倜傥(吐了,5~)";使用正则表达式:
Pattern pattern = Pattern.compile("(\\D*(\\d+).*?)");
能匹配到的是:
但我们要替换的,是分组中的:666和/或5。
所以需要在上述while循环中额外的加入一步:
if (Integer.valueOf(matached) % 3 == 0) { matcher.appendReplacement(sb, matcher .group() //(666,赞……) .replace(matached,"(3n)")); } // else nothing
利用group()和group(1),将(666,赞……)替换成((3n),赞……)之后再进行appendReplacement()的操作。
Java还提供了由String对象直接调用的、可以使用正则表达式的方法:
System.out.println(target.matches(regex)); System.out.println(target.replaceFirst(regex, "xxx")); Arrays.stream(target.split(regex)).forEach(System.out::println);F3演示:他们实际上都是调用了Pattern和Matcher对象,且在方法体中编译(compile)的正则表达式
所以,@想一想@:该不该在循环中使用这些方法?
多快好省!前端后端,线上线下,名师精讲
更多了解 加: