为什么我的\ p {L}会返回下划线?

时间:2013-01-16 14:46:01

标签: c# regex

我有以下代码来解析Regex:

        const string patern = @"^(\p{L}+)_";
        var rgx = new Regex(patern);
        var str1 = "library_log_12312_12.log";
        var m = rgx.Matches(str1);

它只返回一个匹配,它是“library_”。我已经阅读了很多资源,它不应该包含下划线,是吗?

3 个答案:

答案 0 :(得分:4)

您的模式包含_,因此匹配也是如此。如果您只想要,则需要指定。它将在第1组(因为第0组始终是整个匹配):

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        var regex = new Regex(@"^(\p{L}+)_");
        var input = "library_log_12312_12.log";
        var matches = regex.Matches(input);
        var match = matches[0];
        Console.WriteLine(match.Groups[0]); // library_
        Console.WriteLine(match.Groups[1]); // library
    }
}

答案 1 :(得分:0)

你的正则表达式_结束所以基本上,它匹配一个或多个Unicode字母,后跟下划线(不是Unicode字母)。

捕获的群组不会包含_

按预期工作。

答案 2 :(得分:0)

它应该包含正则表达式中的下划线。

如果您只想要library作为结果,则需要访问结果中的第一个子组:

var m = rgx.Matches(str1).Cast<Match>().Select(x => x.Groups[1].Value);