我有这个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
换句话说,*?
量词并不像我预期的那样“不情愿”。我做错了什么?
答案 0 :(得分:4)
问题不在你的正则表达式中,而是在你正在使用的方法中:Matcher.matches()
尝试将模式与整个输入相匹配。量词的不情愿并没有真正获得相关的机会,因为你的输入字符串只能以一种方式匹配模式。
相反,您需要使用Matcher.find()
,它会尝试查找与模式匹配的输入的子字符串。
有关详细信息,请参阅the Javadoc for Matcher
。