C# Net是否使用不同的正则表达式引擎?

C# Net是否使用不同的正则表达式引擎?,c#,regex,parsing,C#,Regex,Parsing,我正在尝试使用正则表达式捕获3个不同的字符串: Del Mar, CA, 92014 结果应该是3个单独的捕获字符串: 德尔马 加利福尼亚州 92014 下面的regex在regexlib.com中工作,输出捕获这3个字符串。但这在C.Net中不起作用。Net查找匹配项,但不捕获3个不同的字符串 ([a-zA-Z\s]*),*\s*([a-zA-Z]{2}),*\s*([0-9]{5,10})\s* 我尝试了不同的regexoption IgnoreCase、ExplicitCapture、

我正在尝试使用正则表达式捕获3个不同的字符串:

Del Mar, CA, 92014
结果应该是3个单独的捕获字符串:

德尔马 加利福尼亚州 92014 下面的regex在regexlib.com中工作,输出捕获这3个字符串。但这在C.Net中不起作用。Net查找匹配项,但不捕获3个不同的字符串

([a-zA-Z\s]*),*\s*([a-zA-Z]{2}),*\s*([0-9]{5,10})\s*
我尝试了不同的regexoption IgnoreCase、ExplicitCapture、IgnorePatternWhitespace,它们都有相同的结果找到匹配项,但没有捕获

C代码:

var _regex = new System.Text.RegularExpressions.Regex(@"([a-zA-Z\s]*),*\s*([a-zA-Z]{2}),*\s*([0-9]{5,10})\s*", RegexOptions.IgnoreCase);
var _matches = _regex.Matches("Del Mar, CA, 92014");

return _matches.Cast<Match>()
   .Select(m => m.Value)
   .ToArray();

对我来说很好

String input = @"Del Mar, CA, 92014";
Regex rgx = new Regex(@"([a-zA-Z\s]*),*\s*([a-zA-Z]{2}),*\s*([0-9]{5,10})\s*");
foreach (Match m in rgx.Matches(input))
{
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine(m.Groups[2].Value);
Console.WriteLine(m.Groups[3].Value);
}

你的问题不是你的正则表达式,而是你如何解释结果。您将返回一个包含4组的匹配项-第一组是整个字符串,其他组是您正在捕获的子字符串。因此,您的返回语句可以是这样的:

return _matches[0].Groups.Cast<Group>().Skip(1)
    .Select(g => g.Value)
    .ToArray();

事实证明,问题出在我自己的代码中。马克是对的。在这个特定的正则表达式中,捕获被“存储”在Match中

最后,我编写了两个助手从正则表达式中提取值,一个用于匹配,另一个用于组

组:


在C中使用\时是否跳过了该选项?我们能看看你的C代码吗?你能展示一个简短但完整的程序来演示你的尝试吗?我试过了,它似乎是根据您的要求工作的,所以您的代码可能有其他错误。如果您的正则表达式字符串声明类似于:string stregex=@[a-zA-Z\s]*,\s*[a-zA-Z]{2},*\s*[0-9]{5,10}\s+\n;ExplicitCapture选项可以防止正则表达式引擎将和作为捕获处理。如果不包含该标志,则结果将包含3个捕获。当缺少代码时,很难理解程序代码的问题。请提供。它将更准确地描述您的问题,并减少对实际细节的进一步猜测。更重要的是,创建简洁的问题演示将提高您对问题和整个程序的理解。
public static IEnumerable<string> GetMatches(string input, string regexPattern)
{
    var _regex = new System.Text.RegularExpressions.Regex(regexPattern, RegexOptions.IgnoreCase);
    var _matches = _regex.Matches(input);

    return _matches.Cast<Match>()
        .Select(m => m.Value)
        .ToArray();
}

public static IEnumerable<string> GetGroups(string input, string regexPattern)
{
    var _regex = new System.Text.RegularExpressions.Regex(regexPattern, RegexOptions.IgnoreCase);
    var _matches = _regex.Matches(input);

    return (from Match _m in _matches
            from Group _g in _m.Groups
            where _g.Value != _m.Value
            select _g.Value)
        .ToArray();
}
public static IEnumerable<string> GetUSPhone(string input)
{
    return GetMatches(input, @"([0-9]( |-)?)?(\(?[0-9]{3}\)?|[0-9]{3})( |-)?([0-9]{3}( |-)?[0-9]{4}|[a-zA-Z0-9]{7})");
}
public static IEnumerable<string> GetUSCityStateZip(string input)
{
    return GetGroups(input, @"(?<City>[a-zA-Z\x20]*)[,]*\t*\x20*(?<State>[a-zA-Z]{2})\x2C*\t*\s*(?<ZipCode>[0-9\x2D\x20]{5,10}|\x20*)");
}