在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

回到顶部