Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两个指定字符串之间查找字符串的正则表达式模式_C#_Regex - Fatal编程技术网

C# 在两个指定字符串之间查找字符串的正则表达式模式

C# 在两个指定字符串之间查找字符串的正则表达式模式,c#,regex,C#,Regex,我有一个文本文件,从中提取一行C#,如下所示: Date: 8/20/2013 12:00:00 AM Source Path: \\build\PM\11.0.25.9\ Destination Path: C:\Users\Documents\testing\11.0.25.9\etc\ Folder Updated: 11.0.25.9 File Copied: 11052_0_X.pts 提取所需变量的最简单方法是创建一个正则表达式模式来查找它 假设我试图从这行文本中提取源路径。 如何

我有一个文本文件,从中提取一行C#,如下所示:

Date: 8/20/2013 12:00:00 AM Source Path: \\build\PM\11.0.25.9\ Destination Path: C:\Users\Documents\testing\11.0.25.9\etc\ Folder Updated: 11.0.25.9 File Copied: 11052_0_X.pts
提取所需变量的最简单方法是创建一个正则表达式模式来查找它

假设我试图从这行文本中提取源路径。 如何创建一个模式,在两个字符串之间查找字符串。例如,如何从“源路径:”和“目标路径:”之间提取源路径字符串

到目前为止,我只知道: Regex.Match(第行@“源路径:”)

为了测试这一点,我使用了im,而且很明显,它所做的就是寻找源路径:至今为止。在字符串“Destination Path:”出现之前,我如何向前看?

您可以使用以下命令:

var path = Regex.Match(line, @"Source Path:\s*(.*)\s*Destination Path:")
                .Groups[1].Value;
或者(使用lookaround断言):


如果您不确定正则表达式是如何工作的(您也是),为什么不使用两个调用
IndexOf()
和一个调用
Substring()
?除非IndexOf/Substring版本是错误的(在修复它之前返回
\\build\PM\11.0.25.9\Destination
),并且缺少任何错误检查,这使得它非常错误。这就是为什么要编写表达意图的代码,而不是编写脆弱的索引操作:)@sehe这是关于错误检查的有效观点,但我不明白为什么你说这比正则表达式更脆弱。它和正则表达式模式一样依赖于输入。是吗?你第一次搞错了,有神奇的常数(不再重复,现在:很好),没有错误检查意味着你将得到
error]致命的未处理异常:System.ArgumentOutOfRangeException:不能为负。
如果
end
为-1,但是如果
start
11
[sic],结果会自动错误。这怎么不脆弱呢?IOW:它很脆弱,因为它不仅依赖于输入,还依赖于它包含特定顺序的特定子字符串,并且没有明确定义的故障模式。正则表达式将返回
。Success==false
。另外,正则表达式用一个字符串表示在两个文本中捕获
(.*?
)的意图。@sehe是的,我同意错误检查(基于索引的代码是一个起点,而不是完整的解决方案),我同意正则表达式是一个通常更灵活的解决方案。但当我看到“在这个固定输入和这个固定输入之间找到一个子串”这样的问题时,regex只是用一个、两个神奇的常数换成一个,并在代码中引入了更多潜在的复杂性。我可能会在我自己的代码中使用正则表达式,这取决于具体情况,但IMO至少应该考虑更简单的解决方案。
var path = Regex.Match(line, @"Source Path:\s*(.*)\s*Destination Path:")
                .Groups[1].Value;
var path = Regex.Match(line, @"(?<=Source Path:\s*).*(?=\s*Destination Path:)")
                .Value;
var startAt = "Source Path:";
var endAt = "Destination Path:";

var start = line.IndexOf(startAt);
var end   = line.IndexOf(endAt);
if (start >= 0 && end >= 0 && (end >= start + startAt.Length))
{
    var path = line.Substring(start + startAt.Length, 
                              end - start - startAt.Length).Trim();
}