正则表达式"不情愿"量词行为不端

时间:2014-05-18 21:33:48

标签: java regex

我有这个Java代码,是LaTex歌集项目的一部分。

Pattern p = Pattern.compile("\\\\retitle\\{(.*?)\\}",Pattern.DOTALL);
Matcher m = p.matcher(in);
System.out.println(m.matches());
System.out.println(m.group(1));

鉴于此输入:

\retitle{Livin' on a prayer}{Bon Jovi}
\begin{song}\begin{vers}[Em]Johnie used to work on the docks\newline
Saving up his money I don't know these l[C]yrics\newline
l[D]ol.\newline
\end{vers}
\end{song}

我期待这个输出:

true
Livin' on a prayer

但我实际上得到了这个:

true
Livin' on a prayer}{Bon Jovi}
\begin{song}\begin{vers}[Em]Johnie used to work on the docks\newline
Saving up his money I don't know these l[C]yrics\newline
l[D]ol.\newline
\end{vers}
\end{song

换句话说,*?量词并不像我预期的那样“不情愿”。我做错了什么?

1 个答案:

答案 0 :(得分:4)

问题不在你的正则表达式中,而是在你正在使用的方法中:Matcher.matches()尝试将模式与整个输入相匹配。量词的不情愿并没有真正获得相关的机会,因为你的输入字符串只能以一种方式匹配模式。

相反,您需要使用Matcher.find(),它会尝试查找与模式匹配的输入的子字符串。

有关详细信息,请参阅the Javadoc for Matcher