java - 当文本匹配时识别匹配的(子)正则表达式

标签 java regex

当在 Java 中匹配组时,是否有可能解析所识别的模式组名称?

例如: 组合图案:(?<A_Pattern>A\n)|(?<B_Pattern>B\n)|(?<C_Pattern>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());
}

背景: 我正在开发一个程序来在日志文件中搜索正则表达式。这不是问题,但我有三个大问题:

  • 巨大的日志文件:由于性能更好,文件应该只传递一次
  • 用户应该能够输入多个模式,每个模式各有一个名称(用于识别名称)
  • 当模式匹配时:输出正则表达式名称

因此,我将模式(正则表达式)连接到一个表达式中,并尝试将名称添加为组名称,但我没有在 Java 中找到解析所识别名称的选项。

是否可以使用正则表达式组名称或任何其他解决方案来执行此操作。组名只是一个尝试。

最佳答案

如果您知道子表达式不包含捕获组,那么您可以这样做:

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;
        }

输出:

Found Pattern2 at index 12: DEF
Found Pattern1 at index 26: ABC
Found Pattern3 at index 36: XYZ
Found Pattern2 at index 52: DEF

如您所见,即使在第二个模式中使用捕获组,匹配检测也能正常工作。

关于java - 当文本匹配时识别匹配的(子)正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37202332/

相关文章:

c# - 解析格式化字符串

hbase - Java API 错误 : org. apahe.hadoop.hbase 不存在

java - Tomcat 私有(private) JVM

java - decode() 没有读取任何内容,但解码了一条消息

regex - 获取 erlang 中命名子模式的值

python - 正则表达式去除字符串空格

Javascript正则表达式获取双引号内的内容

python - 查找两个字符串之间的最短匹配

java - 检查进程是否在 windows/linux 上运行

java - Spring 数据 Redis Pub/Sub 和 Websockets : recieving messages