我有 regexp 解析模板中使用的 freemarker 宏的所有名称(例如来自 <@macroName />
我只需要 macroName
)。模板通常非常大(大约 3 万个字符)。
带有正则表达式的 Java 代码如下所示:
Pattern pattern = Pattern.compile(".*?<@(.*?)[ /].*?",
Pattern.DOTALL | Pattern.UNIX_LINES);
Matcher matcher = pattern.matcher(inputText);
while(matcher.find()){
//... some code
}
但有时我会得到这个异常:
java.util.regex.Pattern$Curly.match1(Pattern.java:3814)
java.util.regex.Pattern$Curly.match(Pattern.java:3763)
java.util.regex.Pattern$Start.match(Pattern.java:3072)
java.util.regex.Matcher.search(Matcher.java:1116)
java.util.regex.Matcher.find(Matcher.java:552)
...
有谁知道为什么会发生这种情况,或者有人可以确定我使用的正则表达式是否经过优化? 谢谢
最佳答案
对于 <@macro macroName />
您的正则表达式看起来有点复杂。要么有一些事情(特殊情况)<@macro macroName />
不要描述,或者正则表达式太用力了。尝试:
<@macro\s+(\S+)\s+/>
您现在应该在第 1 组中有了宏的名称。
关于Java regex matcher.find 偶尔会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832521/