正则表达式匹配中的命名组

Posted

技术标签:

【中文标题】正则表达式匹配中的命名组【英文标题】:Named group in regular expression match 【发布时间】:2015-09-08 09:57:02 【问题描述】:

我正在尝试解析一些源文件以获取一些标准信息。

源文件可能如下所示:

// Name: BoltBait
// Title: Some cool thing

// Name  :
// Title : Another thing

// Title:
// Name:

等等

我用来解析信息的代码如下所示:

Regex REName = new Regex(@"\/2\s*Name\s*:\s*(?<nlabel>.*)\n", RegexOptions.IgnoreCase);
Match mname = REName.Match(ScriptText); // entire source code file
if (mname.Success)

    Name.Text = mname.Groups["nlabel"].Value.Trim();

如果该字段有信息,则效果很好。如果该字段留空,它将不起作用。

例如,在上面的第三个示例中,Title 字段返回匹配“// Name:”,我希望它返回空字符串。

我需要正则表达式专家的帮助。

我觉得正则表达式太贪心,所以我尝试了以下表达式:

@"\/2\s*Name\s*:\s*(?<nlabel>.*?)\n"

然而,它没有帮助。

【问题讨论】:

也许可以试试new Regex(@"\/2\s*Name\s*:\s*(?&lt;nlabel&gt;.+)\n", RegexOptions.IgnoreCase) 【参考方案1】:

您还可以使用class subtraction 来避免匹配换行符:

//[\s-[\r\n]]*Name[\s-[\r\n]]*:[\s-[\r\n]]*(?<nlabel>.*)(?=\r?\n|$)

注意:

[\s-[\r\n]]* - 匹配除换行符以外的任何空格(使用字符类减法) (?=\r?\n|$) - 检查是否存在换行符或字符串结尾的正向前瞻。

见regex demo,输出:

【讨论】:

我刚刚展示了我正在抓取的众多领域中的两个。它们可以按任何顺序排列,可以存在也可以缺失。 我已经编辑了答案,使其只能满足您的需要。我建议的正则表达式是 .NET 特有的,因为 [...-[...]] 只允许在 .NET 中使用。 谢谢。我去看看。【参考方案2】:

\s 包含换行符,这里不需要。 在: 之后显式匹配制表符和空格就足够了

\/2\s*Name\s*:[\t ]*(?<nlabel>.*?)\n

这将在您的第三个示例中正确返回空字符串(对于名称和标题)。

【讨论】:

我不知道 '\s' 包含换行符。这看起来很有希望。我今晚回家看看。谢谢!【参考方案3】:

我的方法是在非捕获组中使用替代来匹配从冒号到行尾的标签。这匹配到行尾的任何内容,或者什么都不匹配。

var text1 = "// Name: BoltBait" + Environment.NewLine + "// Title: Some cool thing" + Environment.NewLine;
var text2 = "// Name  :" + Environment.NewLine + "// Title : Another thing" + Environment.NewLine;
var text3 = "// Title:" + Environment.NewLine + "// Name:" + Environment.NewLine;
var texts = new List<string>()  text1, text2, text3 ;

var options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
var regex = new Regex("^//\\s*?Name\\s*?:(?<nlabel>(?:.*$|$))", options );

foreach (var text in texts)
    var match = regex.Match( text );

    Console.WriteLine( "|" + match.Groups["nlabel"].Value.Trim() + "|" );

生产:

|BoltBait|
||
||

【讨论】:

抓取一个字段的第一次出现对我来说很好。 好吧,我误解了任务。我已更改代码以执行我认为您需要的操作;)

以上是关于正则表达式匹配中的命名组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中的命名捕获组

正则表达式之基础

Boost 正则表达式:获取命名组

正则表达式进阶

Java 正则表达式之捕获组

R中的正则表达式命名组