需要创建一个类似于这个 perl 表达式的 C# 正则表达式
本文关键字:perl 表达式 正则表达式 类似于 一个 创建 | 更新日期: 2023-09-27 17:48:54
我想知道是否可以构建等效的 C# 正则表达式来在文件名中找到此模式。 例如,这是 perl 中的 expr /^filer_('d{10}).txt(.gz)?$/i
我们能否找到或提取'd{10}
部分,以便我可以在处理中使用它?
要创建将忽略字符大小写并与筛选器匹配的 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) 创建一个非捕获组,这意味着它在匹配中使用,但不创建组。
我不确定这是否是你想要的,这就是你如何做到这一点。