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

时间:2015-06-22 19:50:26

标签: c# regex regex-group

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

源文件可能如下所示:

// 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"

然而,它没有帮助。

3 个答案:

答案 0 :(得分:1)

\s包含换行符,这里不需要。 在:

之后显式匹配制表符和空格就足够了
\/{2}\s*Name\s*:[\t ]*(?<nlabel>.*?)\n

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

答案 1 :(得分:1)

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

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

请注意:

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

请参阅regex demo,输出:

enter image description here

答案 2 :(得分:0)

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

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|
||
||