匹配以X开头并以Y结尾的字符串?

时间:2014-10-06 09:59:04

标签: java regex

我希望匹配以.js结尾的每个文件名,并存储在名为lib的目录中。

因此我创建了以下正则表达式:(lib/)(.*?).js$

我在Regex Tester中对表达式(lib/)(.*?).js$进行了测试,并匹配了此文件名:src/main/lib/abc/DocumentHandler.js

要在Java中使用我的表达式,我将其转义为:(lib/)(.*?)\\.js$

然而,Java告诉我我的表达式不匹配。

这是我的代码:

String regEx = "(lib/)(.*?).js$";
String escapedRegEx = "(lib/)(.*?)\\.js$";
Pattern pattern = Pattern.compile(escapedRegEx);
Matcher matcher = pattern.matcher("src/main/lib/abc/DocumentHandler.js");

System.out.println("Matches: " + matcher.matches()); // false :-(

我忘了逃避什么吗?

3 个答案:

答案 0 :(得分:2)

尝试此RegEx模式

String regEx = "(.*)(lib\\/)(.*)(\\.js$)";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher("src/main/lib/abc/DocumentHandler.js");

这对我有用:enter image description here

答案 1 :(得分:2)

使用Matcher.find()代替Matcher.matches()来检查任何字符串的子集。

根据Java Doc:


示例代码:

String regEx = "(lib/)(.*)\\.js$";
String str = "src/main/lib/abc/DocumentHandler.js";

Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);

if (matcher.find()) { // <== returns true if found            
    System.out.println("Matches: " + matcher.group());
    System.out.println("Path: " + matcher.group(2));
}

输出:

Matches: lib/abc/DocumentHandler.js
Path: abc/DocumentHandler

使用Matcher#group(index)来获取通过在正则表达式模式中用括号(...)括起来进行分组的匹配组。


您可以使用String#matches()方法匹配整个字符串。

String regEx = "(.*)(/lib/)(.*?)\\.js$";
String str = "src/main/lib/abc/DocumentHandler.js";
System.out.println("Matched :" + str.matches(regEx)); // Matched  : true

注意:请勿忘记在正则表达式模式中转义具有特殊含义的点.以匹配除新行之外的任何内容。

答案 2 :(得分:1)

首先你不需要逃避它,其次你不匹配字符串的第一部分。

String regEx = "(.*)(lib/)(.*?).js$";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher("src/main/lib/abc/DocumentHandler.js");