.NET Regex - 有关正则表达式'替代'的帮助(管道符号|)

时间:2011-03-21 19:14:18

标签: c# .net regex

我有一个正则表达式,我正在尝试构建处理文件路径并尝试查找目录以“已处理”或“失败”结束的文件路径。

我有这样的事情......

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

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

这很好用。

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

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

我希望它们匹配。

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

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

2 个答案:

答案 0 :(得分:1)

对我来说还可以......在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();

答案 1 :(得分:0)

有很多方法可以做到这一点(越来越复杂,也越来越正确),但最简单的可能就是这样:

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)))
{
    //...

不需要正则表达式。无论如何,正则表达式似乎有点过分,并且可能容易出错。

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