我的要求如下
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})
”并且无效。
答案 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
。