将除特定文件名regex之外的所有具有特定扩展名的文件名进行匹配

  • 本文关键字:文件名 扩展名 regex java regex
  • 更新时间 :
  • 英文 :


来自以下列表

"foo.exe"
"foo.dmg"
"baz.exe"
"this-is-another-file-name.exe"
...

除了特定的字符串"baz.exe" 之外,哪个java正则表达式将匹配以".exe"结尾的每个字符串

谢谢!

编辑:我试过(?=.exe$)(?!baz.exe)

按用户更新。有两种解决方案:

  1. (?<!^baz).exe-使用负查找,匹配组仅为单词的.exe部分
  2. ^(?!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:匹配

最新更新