Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java regex matcher.find偶尔会失败_Java_Regex - Fatal编程技术网

Java regex matcher.find偶尔会失败

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

我有一个regexp,它可以解析模板中使用的freemarker宏的所有名称(例如,从
我只需要
宏名
)。模板通常相当大(大约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+)[ /]");