为什么这个正则表达式可以使用Java而不能使用Groovy
我试图从Oracle网站上提取JDK下载URL列表。我最初在Go中编写了一个工作版本,并尝试将其移植到Groovy,以便在Jenkins中运行。正则表达式在Groovy中不匹配。所以我用Java编写了一个版本来解决问题:
以下Java代码成功:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
StringBuffer contents = new StringBuffer();
String inputLine;
while ((inputLine = in.readLine()) != null)
contents.append(inputLine+"\n");
in.close();
Pattern pattern = Pattern.compile("(http://download\\.oracle\\.com/otn/java/jdk/\\du\\d{2}-b\\d{1,2}/(jdk-\\du\\d{2}-(linux|windows)-x64\\.(exe|tar\\.gz)))");
Matcher matcher = pattern.matcher(contents);
assert matcher.matches();
}
}
然而,Groovy(希望相当于Groovy)失败了:
URL url = new URL('http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html')
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer contents = new StringBuffer();
String inputLine
while ((inputLine = bufferedReader.readLine()) != null)
contents.append(inputLine + "\n");
bufferedReader.close();
def pattern = ~/(http\/\/download\.oracle\.com\/otn\/java\/jdk\/\du\d{2}-b\d{1,2}\/(jdk-\du\d{2}-(linux\|windows)-x64\.(exe\|tar\.gz)))/
def matcher = pattern.matcher(contents)
assert matcher.matches()
为了进行故障排除,我尝试最小化Groovy和Java版本之间的差异(是的,我知道Groovy中有更多的惯用方法来读取URL)
有人知道为什么Groovy版本会失败吗
# 1 楼答案
最大的问题是,在第二个正则表达式中缺少一个
:
(使用http\/
而不是http:\/
)。在那之后,看起来他们应该匹配