例如在Perl中,我可以做到
$x=~/$(\d+)\s/
基本上是从变量x中找到任何以$符号开头的数字,后跟任意空格字符。现在$ 1等于数字。
在C#中我试过
Regex regex = new Regex(@"$(\d+)\s");
if (regex.IsMatch(text))
{
// need to access matched number here?
}
答案 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]