如何选择匹配多个正则表达式的文件列表?

Posted

技术标签:

【中文标题】如何选择匹配多个正则表达式的文件列表?【英文标题】:How to select a list of files which matches multiple Regular Expressions? 【发布时间】:2020-10-19 05:06:57 【问题描述】:

我的代码适用于单个 reg。 exp检查,但现在我需要检查另一个reg。表达。

以下是当前代码,

Regex regex = new Regex(@"\s*(t|T)est\s+(c|C)ommon\s*");

var filelist = from file in Directory.EnumerateFiles(sourceDirectory, "*" + fileExtension, SearchOption.AllDirectories)
                               from line in File.ReadLines(file)
                               .Select(f => regex.Match(f))
                               .Where(m => m.Success)
                               select new
                               
                                   File = file,
                                   Line = line
                               ;

这给了我一个包含“Test Common”的文件的文件路径列表。 现在除了这个检查,我还需要检查“Read Me”。

基本上我需要检查文件是否包含“Test Common”和“Read Me”。

更新

Regex regex = new Regex(@"^\s*\b(type\s*:\s*test\s+common\b\s*\bowner\s*:\s*read\s+me\s*\b)\b\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
    
    var filelist = from file in Directory.EnumerateFiles(sourceDirectory, "*" + fileExtension, SearchOption.AllDirectories)
                                   from line in File.ReadLines(file)
                                   .Select(f => regex.Match(f))
                                   .Where(m => m.Success)
                                   select new
                                   
                                       File = file,
                                       Line = line
                                   ;
               

但这并没有给出任何结果。

-----测试文件-----

---
type: Test common
owner: Read ME
---

#All Tests

This will call all the Tests

【问题讨论】:

【参考方案1】:

您可以使用以下正则表达式模式,该模式使用交替:

^.*\b(test common\b.*\bread me\b|\bread me\b.*\btest common)\b.*$

Regex regex = new Regex(@"^.*\b(test common\b.*\bread me\b|\bread me\b.*\btest common)\b.*$",
                        RegexOptions.IgnoreCase);

另一种选择是使用两个肯定的前瞻来断言每个短语都会出现:

^(?=.*\btest common\b(?=.*\b read me\b).*$

【讨论】:

嗨,谢谢您的回复,我尝试使用您所说的概念,'\b' 我在regexr 中得到了它,但是当我在 VS 中使用相同的表达式时它没有给出任何结果。 Regex regex = new Regex(@"^\s*\b(type\s*:\s*test\s+common\b\s*\bowner\s*:\s*read\s+me\s*\b)\b\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase); 您使用的模式与我的答案不匹配。【参考方案2】:

使用单个 reg exp 不适用于此代码,因为 reg 表达式位于两个单独的行中,而不是在同一行中,并且该过程使其更加复杂。 最简单的解决方案是首先从第一个 reg exp 过滤,然后从第二个 reg 过滤结果。 exp。所以 Finlay 我留下了两个 reg 的文件。表达式匹配。

Regex regex_type = new Regex(@"\s*type\s*:\s*test\s+common\s*", RegexOptions.IgnoreCase);
    Regex regex_owner = new Regex(@"\s*owner\s*:\s*read\s+me\s*", RegexOptions.IgnoreCase);
                

                //Filter from Type
                var filelist = from file in Directory.EnumerateFiles(sourceDirectory, "*" + fileExtension, SearchOption.AllDirectories)
                               from lines in File.ReadLines(file)
                               .Select(lines => regex_type.Match(lines))
                               .Where(m => m.Success)
                               select file;

                //Then filter that from owner
                filelist = from file in filelist
                           from lines in File.ReadLines(file)
                           .Select(lines => regex_owner.Match(lines))
                           .Where(m => m.Success)
                           select file;

【讨论】:

以上是关于如何选择匹配多个正则表达式的文件列表?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配两个或多个逗号分隔的整数

如何匹配plsql中正则表达式中的列表/数组?

将多个正则表达式匹配附加到列表列表

检查列表是不是有一个或多个与正则表达式匹配的字符串

Nginx中的正则如何匹配数字

文件通配符与正则表达式