Java regex matcher.find偶尔会失败
我有一个regexp,它可以解析模板中使用的freemarker宏的所有名称(例如,从Java regex matcher.find偶尔会失败,java,regex,Java,Regex,我有一个regexp,它可以解析模板中使用的freemarker宏的所有名称(例如,从我只需要宏名)。模板通常相当大(大约30000个字符)。 带有正则表达式的Java代码如下所示: Pattern pattern = Pattern.compile(".*?<@(.*?)[ /].*?", Pattern.DOTALL | Pattern.UNIX_LINES); Matcher matcher = pattern.m
我只需要宏名
)。模板通常相当大(大约30000个字符)。
带有正则表达式的Java代码如下所示:
Pattern pattern = Pattern.compile(".*?<@(.*?)[ /].*?",
Pattern.DOTALL | Pattern.UNIX_LINES);
Matcher matcher = pattern.matcher(inputText);
while(matcher.find()){
//... some code
}
有人知道为什么会这样吗?或者有人能确保我使用的regexp是否得到了很好的优化?
谢谢你的
,你的正则表达式看起来有点复杂。要么是有一些事情(特殊情况)是
无法描述的,要么是正则表达式太过努力了。尝试:
<@macro\s+(\S+)\s+/>
现在应该将宏的名称放在组#1中。对于
,您的正则表达式看起来有点复杂。要么是有一些事情(特殊情况)是
无法描述的,要么是正则表达式太过努力了。尝试:
<@macro\s+(\S+)\s+/>
现在,宏的名称应该在组#1中。您可以去掉前导的
*?
,因为您不需要在匹配之前/之间使用文本。正则表达式引擎将负责下一场比赛的扫描,它将比你现在做的更有效率。只要给它标签本身的图案,然后走开
您可以去掉尾随的*?
,因为它从不做任何事情。想想看:它试图匹配任何字符中的零个或多个,不情愿。这意味着它要做的第一件事就是什么都不匹配。该尝试将成功(总是可能不匹配任何内容),因此它从不尝试使用更多字符
您可能需要这样的内容():
您可以去掉前导的*?
,因为您不需要在匹配之前/之间使用文本。正则表达式引擎将负责下一场比赛的扫描,它将比你现在做的更有效率。只要给它标签本身的图案,然后走开
您可以去掉尾随的*?
,因为它从不做任何事情。想想看:它试图匹配任何字符中的零个或多个,不情愿。这意味着它要做的第一件事就是什么都不匹配。该尝试将成功(总是可能不匹配任何内容),因此它从不尝试使用更多字符
您可能需要这样的内容():
什么是异常(以及消息)?你只发布了StackTrace,我甚至对你的正则表达式与你所需要的匹配感到惊讶。这里面有很多问题,从重复使用*?
到[/]
,这与您可能认为的功能不同。我建议你查一下杰弗里·弗里德尔(Jeffrey Friedl),有什么例外(和信息)?你只发布了StackTrace,我甚至对你的正则表达式与你所需要的匹配感到惊讶。这里面有很多问题,从重复使用*?
到[/]
,这与您可能认为的功能不同。我建议你去找杰弗里·弗里德尔,好的,谢谢你的建议。。实际上,我在帖子中将要解析的字符串从改为:)dda的答案仍然适用,只需稍作修改-使用“确定”,谢谢你的建议。。实际上,我在帖子中将要解析的字符串改为:)dda的答案仍然可以应用,只需稍作更改-使用
<@(\w+)[\s/]
Pattern p= Pattern.compile("<@(\\w+)[ /]");