有没有办法让 Regex.Match 只提供预期的捕获组?

Posted

技术标签:

【中文标题】有没有办法让 Regex.Match 只提供预期的捕获组?【英文标题】:Is there a way to have Regex.Match provide only the intended capture group? 【发布时间】:2019-08-25 09:25:03 【问题描述】:

c# regex.match 的工作方式似乎是唯一的捕获组值返回包括与模式匹配的整个字符串。相反,我只想要 1 美元。现在我必须执行第二步来清理结果。有没有更简洁的方法可以减少到 1 步?

var lineText = @"Reservations 03Mar19";
var m1Pattern = @"^\s*Reservations.*\b(\d2\w3\d2)$";

Match m1 = Regex.Match(lineText, m1Pattern);
if (m1.Success) MyDate = Regex.Replace(m1.Groups[0].Captures[0].Value, m1Pattern, @"$1");

【问题讨论】:

if (m1.Success) MyDate = m1.Groups[1].Value; 相关问题:***.com/questions/27444640/… 【参考方案1】:

您可以在您的组中使用?:,告诉正则表达式不要捕获该组:

(?:this group is not captured(but this one is))

比较 Demo 和 this One

这是C# Demo

【讨论】:

您的演示按照正则表达式的工作方式工作。我认为 C# 正则表达式匹配不适用于捕获组。我没有得到任何回应,包括 (?:bla bla bla ) 或 (bla bla bla) - 它只是不在乎。我必须使用替换来获取捕获以在 c# 中工作。 @user2741445 看看this C# demo。你想要的是 2 美元,但不捕获第一组,它在 1 美元中。 是的,Regex.Replace 确实适用于捕获组。感谢 C# 演示。我仍然需要的一件事是知道捕获是否成功。 Regex.Replace 不这样做。我只返回一个我必须进一步评估的字符串。 Regex.Match 告诉我整个模式是否匹配。据我所知,我总是需要至少两行代码使用 c#: (match, 然后 replace) 或类似的东西。在脚本语言中,可以一次性完成。 我对我的 C3 演示进行了更改,请看一下,它会检测是否进行了替换 这非常接近。结果用 if 语句包装以进一步评估。就我而言,如果捕获成功,我需要为结果设置一个变量。如果没有,结果需要保持不变。也许是这样的: (regex.replace(..) = txt) ?结果 = $1:不;。【参考方案2】:

使用MyDate = m1.Groups[1].Value 应该做你想做的事。

【讨论】:

MyDate = m1.Groups[0].Value 与 MyDate = m1.Groups[0].Captures[0].Value 相同(至少对我而言)。问题是我只想要匹配值的一个子集,并且习惯于脚本语言,我可以在没有额外代码的情况下做到这一点。

以上是关于有没有办法让 Regex.Match 只提供预期的捕获组?的主要内容,如果未能解决你的问题,请参考以下文章

php regex preg_match 只允许某些关键字

.net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)

正则表达式之Regex.Match()用法

Java Regex match IP address

如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]

C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制