需要创建一个类似于这个 perl 表达式的 C# 正则表达式

本文关键字:perl 表达式 正则表达式 类似于 一个 创建 | 更新日期: 2023-09-27 17:48:54

我想知道是否可以构建等效的 C# 正则表达式来在文件名中找到此模式。 例如,这是 perl 中的 expr /^filer_('d{10}).txt(.gz)?$/i我们能否找到或提取'd{10}部分,以便我可以在处理中使用它?

需要创建一个类似于这个 perl 表达式的 C# 正则表达式

要创建将忽略字符大小写并与筛选器匹配的 Regex 对象,请尝试以下操作:

Regex fileFilter = new Regex(@"^filter_('d{10})'.txt('.gz)?$", RegexOptions.IgnoreCase),

要执行匹配:

Match match = fileFilter.Match(filename);

要获取值(此处为数字):

if(match.Success)
    string id = match.Groups[1].Value;

匹配组的工作方式类似于 Perl 的匹配,[0]引用整个匹配,[1]第一个子模式/匹配,等等。

注意:在最初的perl代码中,你没有转义.字符,所以它们匹配任何字符,而不仅仅是真实的句点!

是的,你可以。请参阅调用 Regex.Match 返回的 Match 类的 Groups 属性。

在您的情况下,它将大致如下:

Regex yourRegex = new Regex("^filer_('d{10}).txt(.gz)?$");
Match match = yourRegex.Match(input);
if(match.Success)
    result = match.Groups[1].Value;

我不知道正则表达式末尾的/i是什么意思,所以我在我的示例代码中删除了它。

正如 Daniel 所示,您可以通过组访问匹配输入的内容。但是,除了使用默认索引组之外,还可以使用命名组。在下文中,我将介绍如何以及您可以使用 Match 的静态版本。

Match m = Regex.Match(input, @"^(?i)filer_(?<fileID>'d{10}).txt(?:.gz)?$");
if(m.Success)
    string s = m.Groups["fileID"].Value;

perl 中的/i 表示 IgnoreCase,正如 Mario 所示。这也可以使用 (?i) 在正则表达式语句中内联设置,如上所示。

最后一部分 (?:.gz) 创建一个非捕获组,这意味着它在匹配中使用,但不创建组。
我不确定这是否是你想要的,这就是你如何做到这一点。