使正则表达式更具动态性

时间:2014-11-21 17:03:07

标签: java regex

几周前我发布了这个问题,关于使用Java中的正则表达式提取捕获组Extracting Capture Group Using Regex,我得到了一个有效的答案。几周前我还发布了这个问题,关于使用正则表达式Replace Character in Matching Regex进行Java中的字符替换,并且得到了一个更好的答案,比我从第一篇文章中获得的答案更有活力。我将通过示例快速说明。我有一个这样的字符串,我想提取" ID"从:

String idInfo = "Any text up here\n" +
                "Here is the id\n" +
                "\n" +
                "?a0 12 b5\n" +
                "&Edit Properties...\n" +
                "And any text down here";

在这种情况下,我希望输出只是:

a0 12 b5

但事实证明,ID可以是任意数量的八位字节(只需要1个或更多个八位字节),我希望我的正则表达式能够基本上占用1个八位字节的ID,然后是任意数量的后续八位字节(从0到多少)。我在匹配正则表达式帖子中的替换字符中得到答案的人为我的类似但不同的用例做了这个,但我在移植这个"更有活力" regex到第一个用例。

目前,我有......

Pattern p = Pattern.compile("(?s)?:Here is the id\n\n\\?([a-z0-9]{2})|(?<!^)\\G:?([a-z0-9]{2})|.*?(?=Here is the id\n\n\\?)|.+");
Matcher m = p.matcher(certSerialNum);
String idNum = m.group(1);
System.out.println(idNum);

但是它抛出异常。另外,我真的希望它使用模式中包含的所有已知相邻文本,包括&#34;这里是id \ n \ n \?&#34;和&#34; \ n&amp;编辑属性...&#34;。我需要做些什么更正才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

好像你想要这样的东西,

String idInfo = "Any text up here\n" +
        "Here is the id\n" +
        "\n" +
        "?a0 12 b5\n" +
        "&Edit Properties...\n" +
        "And any text down here";
Pattern regex = Pattern.compile("Here is the id\\n+\\?([a-z0-9]{2}(?:\\s[a-z0-9]{2})*)(?=\\n&Edit Properties)");
Matcher matcher = regex.matcher(idInfo);
while(matcher.find()){
        System.out.println(matcher.group(1));
}

输出:

a0 12 b5

DEMO