在Java正则表达式中获取组名
我正在尝试同时接收模式和字符串,并返回组名的映射->匹配结果。
例:
(?<user>.*)
我想返回一个包含“ user”作为键及其匹配值的映射。
问题是我似乎无法从Java regex
api获取组名。我只能按名称或按索引获取匹配的值。我没有组名列表,Pattern和Matcher似乎都没有公开此信息。我检查了它的来源,似乎信息就在那里-
只是不向用户公开。
我尝试了Java的java.util.regex和jregex。(并且不必在乎是否有人建议其他任何支持该功能的,良好的,受支持的和高性能的库)。
回答:
Java中没有API来获取命名捕获组的名称。我认为这是一个缺少的功能。
一种简单的方法是从模式中选择候选的命名捕获组,然后尝试
访问命名组。换句话说,在插入匹配整个模式的字符串之前,您不知道命名捕获组的确切名称。
该Pattern
捕捉名为捕获组的名称是\(\?<([a-zA-Z][a-zA-Z0-9]*)>
(根据派生Pattern
类的文档)。
(最困难的方法是为正则表达式实现解析器并获取捕获组的名称)。
一个示例实现:
import java.util.Scanner;import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.MatchResult;
class RegexTester {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
String regex = scanner.nextLine();
StringBuilder input = new StringBuilder();
while (scanner.hasNextLine()) {
input.append(scanner.nextLine()).append('\n');
}
Set<String> namedGroups = getNamedGroupCandidates(regex);
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int groupCount = m.groupCount();
int matchCount = 0;
if (m.find()) {
// Remove invalid groups
Iterator<String> i = namedGroups.iterator();
while (i.hasNext()) {
try {
m.group(i.next());
} catch (IllegalArgumentException e) {
i.remove();
}
}
matchCount += 1;
System.out.println("Match " + matchCount + ":");
System.out.println("=" + m.group() + "=");
System.out.println();
printMatches(m, namedGroups);
while (m.find()) {
matchCount += 1;
System.out.println("Match " + matchCount + ":");
System.out.println("=" + m.group() + "=");
System.out.println();
printMatches(m, namedGroups);
}
}
}
private static void printMatches(Matcher matcher, Set<String> namedGroups) {
for (String name: namedGroups) {
String matchedString = matcher.group(name);
if (matchedString != null) {
System.out.println(name + "=" + matchedString + "=");
} else {
System.out.println(name + "_");
}
}
System.out.println();
for (int i = 1; i < matcher.groupCount(); i++) {
String matchedString = matcher.group(i);
if (matchedString != null) {
System.out.println(i + "=" + matchedString + "=");
} else {
System.out.println(i + "_");
}
}
System.out.println();
}
private static Set<String> getNamedGroupCandidates(String regex) {
Set<String> namedGroups = new TreeSet<String>();
Matcher m = Pattern.compile("\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>").matcher(regex);
while (m.find()) {
namedGroups.add(m.group(1));
}
return namedGroups;
}
}
}
但是,此实现有一个警告。目前,它不适用于regex
Pattern.COMMENTS
模式。
以上是 在Java正则表达式中获取组名 的全部内容, 来源链接: utcz.com/qa/422178.html