正则表达式匹配一个单词而不是其他单词列表

时间:2014-07-08 09:21:09

标签: c# regex c#-3.0

我正在写一个c#应用程序。

我试图编写一个正则字符串,它将字符串与模式匹配:

目标是测试字符串是否与模式匹配:任何字符串任何时间,然后是句点,然后是bla而不是blo,bli或blu,然后是句点,然后是扩展列表。它还需要不区分大小写。

这是我到目前为止所拥有的

var pattern = string.Format(@".*\.(?i){0}\.(?:ext|ext1|ext2|ext3)", "bla");

它适用于使用bla查找字符串。现在,我希望能够在完全相同的位置过滤掉三个字符串的列表。

我有一个FileInfo项目列表

  • 任何char都会执行的fileName示例。 bla .ext
  • 任何char都会执行的fileName示例。 bla .ext1
  • 任何char都会执行的fileName示例。 bla .ext2
  • 任何char都会执行的fileName示例。 blu .ext
  • 任何char都会执行的fileName示例。 blo .ext1
  • 任何char都会执行的fileName示例。 bli .ext2

我希望检索那些符合上述模式的人:

  • 任何char都会执行的fileName示例。 bla .ext
  • 任何char都会执行的fileName示例。 bla .ext1
  • 任何char都会执行的fileName示例。 bla .ext2

没关系。

  • 任何char都会执行的fileName示例。 blu .ext
  • 任何char都会执行的fileName示例。 blo .ext1
  • 任何char都会执行的fileName示例。 bli .ext2

这些是

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

我不确定为什么要使用string.Format()(?i)(?:ext|ext1|ext2|ext3)之类的内容使其变得复杂。尝试:

var list = Directory.GetFiles(path).Where(file => Regex.IsMatch(file, @"^.+\.bla\.ext[1-3]*$", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase)).ToList();

当然,我建议使用正则表达式的实例而不是使用静态IsMatch方法来获得更好的performance,但我会让你自己这样做。

答案 1 :(得分:0)

好吧,我是通过检索所有文件而不是那些符合以下模式的文件来反过来的。

var pattern = string.Format(@".*\.(?i)(?:{0})\.(?:ext|ext1|ext2|ext3)", new List<string>() { "bli", "blo", "blu"});

listTmp.AddRange(Directory.GetFiles(myPath))
                          .Where(f => !new Regex(pattern).IsMatch(f)).ToList());