Java正则表达式group是一种把正则表达式中的子表达式括起来的方法,它可以将一个字符串分割成多个部分,并将这些部分存储在一个数组中。Group可以用来捕获文本,也可以用来对文本进行重新排序。
Group的语法是在正则表达式中使用小括号()来标识,它会将小括号内的内容作为一个整体进行处理。例如:
String str = "Hello World"; Pattern pattern = Pattern.compile("(\\w+)\\s(\\w+)"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { System.out.println(matcher.group(1)); // Hello System.out.println(matcher.group(2)); // World }
上面的代码中,我们使用了两对小括号来标识group,其中第一对小括号匹配单词字符(\w+),空格(\s)和第二对小括号匹配单词字符(\w+)。当执行matcher.find()时,会返回true并将匹配的内容保存在group中。我们可以通过matcher.group(1)和matcher.group(2)来访问这些内容。
我们可以通过括号将多个字符组合为一个单位。例如,(ab)
。
正则表达式中的每个组都有一个组号,从1开始。
Matcher类中的方法groupCount()返回与Matcher实例相关联的模式中的组数。
组0引用整个正则表达式和不由groupCount()方法报告。
正则表达式中的每个左括号标记新组的开始。
我们可以在正则表达式中返回引用组号。
假设我们要匹配以“abc"开头,后跟“xyz"的文本,后跟“abc"。
我们可以写一个正则表达式为“abcxyzabc"。
我们可以使用反向引用将正则表达式重写为“(abc)xyz 1"。 1
指第1组,即(abc)
。
2
引用组2, 3
引用组3,依此类推。
以下代码显示如何显示格式化的电话号码。在正则表达式 b(d{3})(d{3})(d{4})b
b
表示我们感兴趣的是仅在字边界匹配十个数字。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String regex = "(d{3})(d{3})(d{4})"; Pattern p = Pattern.compile(regex); String source = "1234567890, 12345, and 9876543210"; Matcher m = p.matcher(source); while (m.find()) { System.out.println("Phone: " + m.group() + ", Formatted Phone: (" + m.group(1) + ") " + m.group(2) + "-" + m.group(3)); } } }
上面的代码生成以下结果。
以下代码显示如何引用替换文本中的组。
$n
,其中 n
是组编号,替换文本内部是指组 n
的匹配文本。
例如, $1
是指第一个匹配的组。要重新格式化电话号码,我们将使用($1) $2- $3
。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String regex = "(d{3})(d{3})(d{4})"; String replacementText = "($1) $2-$3"; String source = "1234567890, 12345, and 9876543210"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(source); String formattedSource = m.replaceAll(replacementText); System.out.println("Text: " + source); System.out.println("Formatted Text: " + formattedSource); } }
上面的代码生成以下结果。
我们可以在正则表达式中使用命名组。
我们可以命名一个组,然后使用他们的名字来引用参考组。
我们可以在替换文本中引用组名称,并使用组名称获取匹配的文本。
定义命名组的格式为
(?<groupName>pattern)
一对括号标记一个组。开始括号后面跟着一个?
和放在尖括号中的组名称。
组名称只能包含字母和数字,且只能以字母开头。
以下正则表达式具有三个命名组。
正则表达式匹配10位数的电话号码。
(?<areaCode>d{3})(?<prefix>d{3})(?<postPhoneNumber>d{4})
以下代码显示如何使用命名组。
String replacementText = "(${areaCode}) ${prefix}-${postPhoneNumber}";
我们可以混合组号和组名。
上述正则表达式可以重写如下。
String replacementText = "(${areaCode}) ${prefix}-$3";
以下代码显示如何在正则表达式中使用组名称以及如何在替换文本中使用名称。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String regex = "(?<areaCode>d{3})(?<prefix>d{3})(?<postPhoneNumber>d{4})"; String replacementText = "(${areaCode}) ${prefix}-$3"; String source = "1234567890 and 9876543210"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(source); String formattedSource = m.replaceAll(replacementText); System.out.println("Text: " + source); System.out.println("Formatted Text: " + formattedSource); } }
上面的代码生成以下结果。
我们可以使用 start()
和 end()
方法来获取组的匹配边界。 这些方法重载:
int start() int start(int groupNumber) int start(String groupName) int end() int end(int groupNumber) int end(String groupName)
方法返回上一次匹配的开始和结束。
以下代码显示如何匹配10位电话号码,并为每个成功匹配打印每个组的开始。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String regex = "(?<areaCode>d{3})(?<prefix>d{3})(?<postPhoneNumber>d{4})"; String source = "1234567890, 12345, and 9876543210"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(source); while (m.find()) { String matchedText = m.group(); int start1 = m.start("areaCode"); int start2 = m.start("prefix"); int start3 = m.start("postPhoneNumber"); System.out.println("Matched Text:" + matchedText); System.out.println("Area code start:" + start1); System.out.println("Prefix start:" + start2); System.out.println("Line Number start:" + start3); } } }
上面的代码生成以下结果。
JPA教程 -JPA ID注释示例来自JPA的@Id注释用于将Java字段标记为数据库表主键列。public class Person{@Idprivate long id;...上...
JPA教程 -JPA ID表生成器示例我们可以使用一个表作为id生成表。以下代码使用@TableGenerator创建表并设置id值的初始值。然后它使...
JPA教程 -JPA ElementCollection映射关键实体示例在JPA中,我们可以将通用类型的Map映射到数据库。以下代码定义了一个通用映射,...
JPA教程 -JPA嵌入式共享示例对于嵌入式实体,我们可以在不同实体之间共享它们。当嵌入它时,我们也可以覆盖可嵌入的实体。以下代...
JPA教程 -JPA 一对一映射示例本节介绍如何在JPA映射中执行一对一映射。此示例假设一个人只能是一个部门的一部分,而一个部门只能...