我希望匹配以.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 :-(
我忘了逃避什么吗?
答案 0 :(得分:2)
尝试此RegEx模式
String regEx = "(.*)(lib\\/)(.*)(\\.js$)";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher("src/main/lib/abc/DocumentHandler.js");
这对我有用:
答案 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");