说,我有一个字符串,我需要验证格式的正确;例如RR1234566-001
(2个字母,7个数字,短划线,1个或更多数字)。我用的是:
Regex regex = new Regex(patternString);
if (regex.IsMatch(stringToMatch))
{
return true;
}
else
{
return false;
}
这可以告诉我stringToMatch
是否遵循patternString
定义的模式。我需要的是(我最后提取这些):
123456
和001
- 即stringToMatch
的部分内容。
请注意,这不是关于如何构造正则表达式的问题。我要问的是:“有没有办法同时匹配和提取值,而不必在以后使用拆分功能?”
答案 0 :(得分:62)
您可以使用正则表达式组来完成此任务。例如,这个正则表达式:
(\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
P.S。在C#中,您可以使用@“”样式字符串来避免转义反斜杠。例如,@“\ hi \”等于“\\ hi \\”。适用于正则表达式和路径。
P.S.2。第一组存储在Group [1]中,而不是像您期望的那样存储在Group [0]中。那是因为Group [0]包含整个匹配的字符串。
答案 1 :(得分:13)
使用分组和匹配。
即:
// 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;
答案 2 :(得分:12)
您可以使用括号捕获字符组:
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;
}
答案 3 :(得分:-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;
}