我有一个正则表达式,我正在尝试构建处理文件路径并尝试查找目录以“已处理”或“失败”结束的文件路径。
我有这样的事情......
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)))
如果我能以某种方式将两个正则表达式查询合并为一个说“匹配以失败结束的路径”或“已处理”并且还匹配“失败”或“已处理”目录中存在的文件“,那么”令人惊讶。但是现在,我满足于有两个单独的正则表达式调用并让第二个工作。
答案 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类的用途。