在Perl中,您使用括号来提取匹配,这与c#中的相同

时间:2015-01-15 23:15:29

标签: c# regex perl

例如在Perl中,我可以做到 $x=~/$(\d+)\s/基本上是从变量x中找到任何以$符号开头的数字,后跟任意空格字符。现在$ 1等于数字。 在C#中我试过

Regex regex = new Regex(@"$(\d+)\s");

    if (regex.IsMatch(text))
    {
        // need to access matched number here?
    }

3 个答案:

答案 0 :(得分:3)

首先,你的正则表达式$(\d+)\s实际上意味着:在字符串结束后找到一个数字。它永远不会匹配。你必须逃避$,因为它是一个元字符。

无论如何,这个等效的C#是:

var match = Regex.Match(text, @"\$(\d+)\s");
if (match.Success)
{
    var number = match.Groups[1].Value;
    // ...
}

而且,为了更好的可维护性,可以命名组:

var match = Regex.Match(text, @"\$(?<number>\d+)\s");
if (match.Success)
{
    var number = match.Groups["number"].Value;
    // ...
}

在这种特殊情况下,您甚至不必首先使用群组:

var match = Regex.Match(text, @"(?<=\$)\d+(?=\s)");
if (match.Success)
{
    var number = match.Value;
    // ...
}

答案 1 :(得分:2)

使用Match方法而不是IsMatch,您需要转义$以使其与字面匹配,因为它是一个特殊含义的字符,意思是“字符串结束”。

Match m = Regex.Match(s, @"\$(\d+)\s");
if (m.Success) {
    Console.WriteLine(m.Groups[1].Value);
} 

答案 2 :(得分:2)

要获得匹配的结果,请使用Match代替IsMatch

var regex = new Regex("^[^@]*@(?<domain>.*)$"); 
// accessible via 
regex.Match("foo@domain.com").Groups["domain"]
// or use an index
regex.Match("foo@domain.com").Matches[0]