C# .NET正则表达式-有关正则表达式的帮助';备选方案';(管道符号|)

C# .NET正则表达式-有关正则表达式的帮助';备选方案';(管道符号|),c#,.net,regex,C#,.net,Regex,我试图构造一个正则表达式,它处理文件路径,并试图找到目录以“Processed”或“Failed”结尾的文件路径 我有这样的东西 static string PROCESSED_DIRECTORY = "Processed"; static string FAILURE_DIRECTORY = "Failed"; ... if (Regex.IsMatch(FileFullPath, String.Format(@"(.*)\\({0})|({1})$"

我试图构造一个正则表达式,它处理文件路径,并试图找到目录以“Processed”或“Failed”结尾的文件路径

我有这样的东西

        static string PROCESSED_DIRECTORY = "Processed";
        static string FAILURE_DIRECTORY = "Failed";

...
    if (Regex.IsMatch(FileFullPath, String.Format(@"(.*)\\({0})|({1})$", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)))....
这个很好用

但是,我创建了一个额外的正则表达式,因为我还试图匹配位于已处理或失败目录中的文件的发生率。正则表达式不匹配,我相信它与管道符号有关。当我检查没有管道符号的“失败”或“已处理”时,它匹配

例如:以下文件不匹配 -C:\ftp\business\Processed\file.txt -C:\ftp | business\Failed\file.txt

我希望他们能匹配

if (Regex.IsMatch(FileFullPath, String.Format(@"(.*)\\({0}|{1})\\(.*)", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)))

如果我能以某种方式将两个正则表达式查询组合成一个,说“匹配一个以失败或已处理结尾的路径,还匹配一个存在于“失败”或“已处理”目录中的文件”,那将是令人惊讶的。不过现在,我满足于有两个单独的regex调用,并让第二个开始工作。

对我来说没问题。。。在LINQPad中运行此命令:

string PROCESSED_DIRECTORY = "Processed";
string FAILURE_DIRECTORY = "Failed";

string FileFullPath = @"C:\ftp\business\Processed\moof\file.txt";
Regex.IsMatch(FileFullPath, String.Format(@"(.*)\\({0}|{1})\\(.*)", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)).Dump();


FileFullPath = @"C:\ftp|business\Failed\file.txt";
Regex.IsMatch(FileFullPath, String.Format(@"(.*)\\({0}|{1})\\(.*)", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)).Dump();
以下版本将查找包含已处理/失败字符串或以\processed | failed\filename.ext结尾的字符串:

string PROCESSED_DIRECTORY = "ProcessedPath";
string FAILURE_DIRECTORY = "FailedPath";

string FileFullPath = @"C:\ftp\business\ProcessedPath\moof\file.txt";
Regex.IsMatch(FileFullPath, String.Format(@"((.*)\\({0}|{1})\\(.*))|(.*\\(Processed|Failed)\\(?!.*\\.*))", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)).Dump();

FileFullPath = @"C:\ftp\business\NotTheProcessedPath\moof\Processed\file.txt";
Regex.IsMatch(FileFullPath, String.Format(@"((.*)\\({0}|{1})\\(.*))|(.*\\(Processed|Failed)\\(?!.*\\.*))", PROCESSED_DIRECTORY, FAILURE_DIRECTORY)).Dump();

有很多方法可以做到这一点(逐渐变得更加复杂和正确),但最简单的方法可能是:

var targetStrings = new[] { PROCESSED_DIRECTORY, FAILURE_DIRECTORY }; //needles
string FileFullPath = @"C:\ftp\business\Processed\moof\file.txt"; //haystack

if (FileFullPath.Split('\\').Any(str => targetStrings.Contains(str)))
{
    //...
不需要正则表达式。Regex似乎有些矫枉过正,而且在这方面可能容易出错


可能与你在这里做的任何事情有关;这就是Path类的用途。

你说它失败了,你能详细说明一下吗?您是否遇到异常,它是否无法匹配?你用的是什么测试数据?我调整了添加更多信息对我来说没问题。。。在LINQPad:string PROCESSED_DIRECTORY=“PROCESSED”中运行此命令;字符串失败\u DIRECTORY=“Failed”;字符串FileFullPath=@“C:\ftp\business\Processed\file.txt”;Regex.IsMatch(FileFullPath,String.Format(@“(.*)\({0}{1})\(.*)”,已处理目录,失败目录)).Dump();FileFullPath=@“C:\ftp|business\Failed\file.txt”;Regex.IsMatch(FileFullPath,String.Format(@“(.*)\({0}{1})\(.*)”,已处理目录,失败目录)).Dump();对这两种情况都返回True。抱歉,注释字段占用了我的格式…@Pete,如果我在.NET4中运行该表达式,我会遇到一个错误,即括号太多。你有没有故意从我原来的正则表达式中排除双斜杠“\\”?没有,这是一个有趣的粘贴。出于格式化的目的,我会给出一些答案。哇,这是我的错误。我使用的测试数据(不是我问题中发布的数据)是“C:\temp\Directory\Failed.txt”,它不匹配…它不应该匹配。谢谢:):P