来自以下列表
"foo.exe"
"foo.dmg"
"baz.exe"
"this-is-another-file-name.exe"
...
除了特定的字符串"baz.exe"
之外,哪个java正则表达式将匹配以".exe"
结尾的每个字符串
谢谢!
编辑:我试过(?=.exe$)(?!baz.exe)
按用户更新。有两种解决方案:
(?<!^baz).exe
-使用负查找,匹配组仅为单词的.exe部分^(?!baz.exe).*
-使用负前瞻,匹配组包含整个文件名
两者都使用";grep-P";以及来自Java(\
必须替换为)。还要注意Java的Matcher匹配()和Matcherfind()的工作方式不同,请参阅我的示例:
import java.util.regex.*;
public class RegexLookaround {
public static void main(String args[]) {
String[] strings = new String[] { "bax.exe", "baz.exe", "baza.exe", "abaz.exe", "bazbaz.exe" };
Pattern p = Pattern.compile(args[0]);
for (String s : strings) {
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println("m: " + m.group());
}
while (m.find()) {
System.out.println("f: " + m.group());
}
}
}
}
测试:
$ java -cp . RegexLookaround '(?<!^baz).exe'
f: .exe
f: .exe
f: .exe
f: .exe
$ java -cp . RegexLookaround '^(?!baz.exe).*'
m: bax.exe
m: baza.exe
m: abaz.exe
m: bazbaz.exe
如果存在baz
,则会使用look behind
,如果存在匹配,则会丢弃。我假设您正在逐一检查filenames
。因此使用了锚CCD_ 11和CCD_。
Regex:^(?!baz).*.exe$
Regex101演示
正如@Wajahat所指出的,这个问题可以直接从Regex中得到答案:匹配除之外的所有内容(也是谷歌的第一个答案)。
^(?!.*(baz)).*exe
- foo.exe:匹配
- baz.exe:不匹配
- whaterver.exe:匹配