【发布时间】:2014-11-22 03:24:50
【问题描述】:
我在几周前发布了这个问题,涉及使用 Java 中的正则表达式提取捕获组,Extracting Capture Group Using Regex,我收到了一个有效的答案。几周前我还发布了这个关于使用正则表达式在 Java 中替换字符的问题,Replace Character in Matching Regex,并收到了一个比我从第一篇文章中得到的更动态的答案。我将通过示例快速说明。我有一个这样的字符串,我想从中提取“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 到很多)。我在匹配正则表达式中的替换字符帖子中收到答案的人为我的一个类似但不同的用例做了这个,但我在将这个“更动态”的正则表达式移植到第一个用例时遇到了麻烦。
目前,我有...
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);
但是它抛出了一个异常。此外,我实际上希望它使用模式中所有已知的相邻文本,包括“这是 id\n\n\?”和“\n&编辑属性...”。我需要进行哪些更正才能使其正常工作?
【问题讨论】:
-
(?s)?:Here错误。左括号在哪里?再次检查正则表达式。 -
你是说这个regex101.com/r/uT5cC0/4 吗?
-
如果您希望字符串文字中的反斜杠字符 (\) 由模式编译器解释,则必须对其进行转义以防止其被解析为字符转义:
"...\\?..."。这是可选的,字符串解析器和模式编译器将以相同的方式解释转义,例如序列\n。 -
@JohnBollinger 啊当然,我怎么会忘记。我的错。谢谢!有人想对此做出回应,我可以标记为答案吗?