27

说,我有一个字符串,我需要验证其正确格式;例如RR1234566-001(2 个字母,7 个数字,破折号,1 个或多个数字)。我使用类似的东西:

        Regex regex = new Regex(patternString);
        if (regex.IsMatch(stringToMatch))
        {
            return true;
        }
        else
        {
            return false;
        }

这可以告诉我是否stringToMatch遵循patternString. 我需要的是(我稍后会提取这些)是: 123456001- 即stringToMatch.

请注意,这不是关于如何构造正则表达式的问题。我要问的是:“有没有一种方法可以同时匹配和提取值,而不必稍后使用拆分函数?”

4

4 回答 4

72

您可以使用正则表达式组来实现这一点。例如,这个正则表达式:

(\d\d\d)-(\d\d\d\d\d\d\d)

让我们用这个正则表达式匹配一个电话号码:

var regex = new Regex(@"(\d\d\d)-(\d\d\d\d\d\d\d)");
var match = regex.Match("123-4567890");
if (match.Success)
    ....

如果匹配,您将在以下位置找到前三位数字:

match.Groups[1].Value

第二个 7 位数字:

match.Groups[2].Value

PS 在 C# 中,您可以使用 @"" 样式字符串来避免转义反斜杠。例如,@"\hi\" 等于 "\\hi\\"。对正则表达式和路径很有用。

PS2。第一个组存储在 Group[1] 中,而不是您期望的 Group[0]。那是因为 Group[0] 包含整个匹配的字符串。

于 2009-05-08T21:28:11.417 回答
18

改用分组和匹配。

IE:

// NOTE: pseudocode.
Regex re = new Regex("(\\d+)-(\\d+)");
Match m = re.Match(stringToMatch))

if (m.Success) {
  String part1 = m.Groups[1].Value;
  String part2 = m.Groups[2].Value;
  return true;
} 
else {
  return false;
}

您还可以命名匹配项,如下所示:

Regex re = new Regex("(?<Part1>\\d+)-(?<Part2>\\d+)");

并像这样访问

  String part1 = m.Groups["Part1"].Value;
  String part2 = m.Groups["Part2"].Value;
于 2009-05-08T21:37:18.740 回答
13

您可以使用括号来捕获字符组:

string test = "RR1234566-001";

// capture 2 letters, then 7 digits, then a hyphen, then 1 or more digits
string rx = @"^([A-Za-z]{2})(\d{7})(\-)(\d+)$";

Match m = Regex.Match(test, rx, RegexOptions.IgnoreCase);

if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);    // RR
    Console.WriteLine(m.Groups[2].Value);    // 1234566
    Console.WriteLine(m.Groups[3].Value);    // -
    Console.WriteLine(m.Groups[4].Value);    // 001
    return true;
}
else
{
    return false;
}
于 2009-05-08T21:44:56.197 回答
-1
string text = "RR1234566-001";
string regex = @"^([A-Z a-z]{2})(\d{7})(\-)(\d+)";
Match mtch = Regex.Matches(text,regex);
if (mtch.Success)
{
    Console.WriteLine(m.Groups[1].Value);    
    Console.WriteLine(m.Groups[2].Value);    
    Console.WriteLine(m.Groups[3].Value);    
    Console.WriteLine(m.Groups[4].Value);    
    return true;
}
else
{
    return false;
}
于 2015-02-27T06:30:40.843 回答