如何选择匹配多个正则表达式的文件列表?
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;
【讨论】:
以上是关于如何选择匹配多个正则表达式的文件列表?的主要内容,如果未能解决你的问题,请参考以下文章