正则表达式在Ruby中匹配,但在Java中不匹配?

时间:2014-03-27 19:01:29

标签: java regex

为了获得更多正则表达式的经验(同时也让工作中的生活变得更轻松),我试图用Java解析一些文件名。

我的字符串是:/home/user/example/Results/ExampleFilePrefix_20140324-0500_OptionalTextThatMightContainNumbers123.csv

基本上文件名将始终以ExampleFilePrefix_开头,后跟时间戳,有时以OptionalTextThatMightContainNumbers123结尾,具体取决于文件的生成方式。我想要的相关信息是时间戳,后跟可选文本(如果存在)。

我正在搞乱各种正则表达式,虽然我可以让它们全部使用Ruby正则表达式解析器,但我无法让它们在Java中工作。我去的时候并没有跟踪它们,但这是我最近的尝试:

_(\w+-\w+)

在Ruby中可以正常工作:http://rubular.com/r/K2BiboURRo,但在Java中甚至没有接近匹配:http://fiddle.re/c7m04

由于在线解析器无法匹配,我不会认为我编写的代码存在问题,但我会将其粘贴到此处以确保

private String extractFileName(String filename) {
    String resultNameBase = "RegexDidntMatch";
    Pattern pattern = Pattern.compile("_(\\w+-\\w+)", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(filename);
    if (matcher.matches() && matcher.find()) {
        resultNameBase = matcher.group(1);
    }
    return resultNameBase;
}

一如既往地感谢所有人提前

2 个答案:

答案 0 :(得分:2)

这部分是问题:

if (matcher.matches() && matcher.find())

Matcher#matches()将完整的输入字符串与正则表达式匹配。

将其替换为:

if (matcher.find())

答案 1 :(得分:2)

仅有matcher.find()中的第一个{+ 1}而是0而不是1

if (matcher.find()) {
    resultNameBase = matcher.group();
}