Java 文本匹配时标识匹配的(子)正则表达式
在Java中匹配组时,是否有可能解析已识别的模式组名称 例如: 组合模式:Java 文本匹配时标识匹配的(子)正则表达式,java,regex,Java,Regex,在Java中匹配组时,是否有可能解析已识别的模式组名称 例如: 组合模式:(?A\n)|(?B\n)|(?C\n) 节目: Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(fromFile(logFilename)); // Find all matches while (matcher.find()) { // should output e.g. A_Pattern Sy
(?A\n)|(?B\n)|(?C\n)
节目:
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(fromFile(logFilename));
// Find all matches
while (matcher.find()) {
// should output e.g. A_Pattern
System.out.println("Found pattern: " + matcher.groupName());
}
背景:
我正在开发一个程序,在日志文件中搜索正则表达式。这不是问题,但我有三个大问题:
- 巨大的日志文件:由于性能更好,文件应该只传递一次
- 用户应该能够输入多个模式,每个模式有一个名称(以标识名称)
- 模式匹配时:输出正则表达式名称
是否可以使用正则表达式组名或任何其他解决方案来实现这一点。组名只是一个尝试 如果知道子表达式不包含捕获组,则可以执行以下操作:
String regex = "(A\n)|(B\n)|(C\n)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// Find all matches
while (matcher.find()) {
if (matcher.group(1) != null)
System.out.println("Found pattern A at index " + matcher.start(1));
else if (matcher.group(2) != null)
System.out.println("Found pattern B at index " + matcher.start(2));
else
System.out.println("Found pattern C at index " + matcher.start(3));
}
如果您有N个要匹配的模式,则允许模式包含捕获组,并且您需要知道哪个模式匹配,您可以按如下方式分配命名组:
String[] patterns = { "ABC", "D(EF)", "XYZ" };
String input = "Lorem ipsum DEF dolor sit ABC amet, XYZ consectetur DEF adipiscing elit";
String[] names = new String[patterns.length];
StringBuilder regex = new StringBuilder();
for (int i = 0; i < patterns.length; i++) {
Pattern.compile(patterns[i]); // validate
names[i] = "Pattern" + (i+1);
if (i != 0)
regex.append('|');
regex.append("(?<").append(names[i]).append('>').append(patterns[i]).append(')');
}
Pattern pattern = Pattern.compile(regex.toString());
for (Matcher matcher = pattern.matcher(input); matcher.find(); )
for (int i = 0; i < patterns.length; i++)
if (matcher.start(names[i]) != -1) {
System.out.println("Found " + names[i] +
" at index " + matcher.start(names[i]) +
": " + matcher.group(names[i]));
break;
}
如您所见,匹配检测工作正常,即使第二种模式中有捕获组。即使没有组名,不匹配的捕获组也会返回null,因此如果
(?:(a)|(B))
匹配,索引1或索引2都将返回null。我也有这个想法,但不幸的是,我不知道合并了多少次正则表达式。因此,我无法通过每个匹配器->组(索引)
。或者我错过了什么?也不能告诉你组名是什么。您可以询问为已知组名捕获的值,但您必须知道名称。好的,谢谢-是否还有其他可能识别子正则表达式?问题:如果文件很大,则无法将整个文件加载到内存中,因此您不是一次只读取一行文件吗?谢谢您的评论,但不幸的是,我不知道这一点。他们应该能够有子捕获组。因此,我希望我可以给父组一个名称来识别它们:-/如果您分配名称,您可以这样做,因为这样您就知道名称,并且可以使用这里描述的相同方法,除了您可以调用group(name1)
和start(name1)
。或者对于多个名称,它们可能位于一个数组中:group(name[i])
和start(name[i])
,循环i
,直到找到非空值。