如何结合两个RegEx

时间:2017-06-12 04:56:37

标签: regex

我的要求如下

1234 1234567890 1234 (or 1234-1234567890-1234)
     1234567890 1234 (or 1234567890-1234)

以下是我的ReqEx

(\d{4})[ -]?(\d{10})[ -]?(\d{4})
            (\d{10})[ -]?(\d{4})

以上表达式工作正常。

Regex validate = new Regex(@"(\d{4})[ -]?(\d{10})[ -]?(\d{4})");
Console.WriteLine(validate.Replace("123412345678901234", "$1-$2-$3"));
O/P: 1234-1234567890-1234

Regex validate = new Regex(@"(\d{10})[ -]?(\d{4})");
Console.WriteLine(validate.Replace("12341234567890", "$1-$2"));
O/P: 1234-1234567890

但是,如何将上述2个RegEx合并为单个。

我尝试使用“(?:(\d{4})[ -])?(\d{10})[ -]?(\d{4})”并且无效。

1 个答案:

答案 0 :(得分:2)

在C#中很容易实现,只需使用一个可选的非捕获组,然后在匹配评估器中检查该组内的捕获组是否匹配。

@"(?:(\d{4})[ -]?)?(\d{10})[ -]?(\d{4})");
  ^^^            ^^     

我觉得你也想要只匹配一个只包含1个电话号码的字符串。如果是这样,请在开头添加\A,在结尾添加\z以要求完整字符串匹配。

请参阅this C# demo

var vals = new List<string> {"123412345678901234", "12341234567890"};
var validate = new Regex(@"\A(?:(\d{4})[ -]?)?(\d{10})[ -]?(\d{4})\z");
foreach (var val in vals) {
    Console.WriteLine(validate.Replace(val, m =>
        m.Groups[1].Success ? $"{m.Groups[1].Value}-{m.Groups[2].Value}-{m.Groups[3].Value}" : 
        $"{m.Groups[2].Value}-{m.Groups[3].Value}")
    ); // => 1234-1234567890-1234, 1234-1234567890
}

注意:如果使用RegexOptions.RightToLeft选项编译正则表达式对象,则第二次输入将获得1234123456-7890