我有以下RegEx模式,以确定一些3位数的电话号码交换:
(?:2(?:04|[23]6|[48]9|50)|3(?:06|43|65)|4(?:03|1[68]|3[178]|50)|5(?:06|1[49]|79|8[17])|6(?:0[04]|13|39|47)|7(?:0[59]|78|8[02])|8(?:[06]7|19|73)|90[25])
它看起来相当令人生畏,但它只能产生大约40或50个数字。在C#中有一种方法可以生成与此模式匹配的所有数字吗?另外,我知道我可以遍历数字001到999,并根据模式检查每个数字,但有没有更清晰,内置的方式来生成列表或匹配数组?
即 - {"204","226","236",...}
答案 0 :(得分:0)
不,没有现成的工具来确定给定正则表达式模式的所有匹配。蛮力是测试模式的唯一方法。
目前还不清楚为什么你使用的是(?: )
,这是"匹配但不能捕获"。它用于锚定匹配,例如,将此电话文字phone:303-867-5309
放在我们不关心phone:
的地方,但我们想要这个号码。
使用的模式是
(?:phone\:)(\d{3}-\d{3}-\d{4})
匹配整行,但 capture 返回的只是电话号码303-867-5309
的第二个匹配项。
所以提到的(?: )
用于锚定特定点的匹配捕获;与文本匹配文本扔掉。
话虽如此,我已经通过评论和2000年的测试重做你的模式:
string pattern = @"
^ # Start at beginning of line so no mid number matches erroneously found
(
2(04|[23]6|49|[58]0) # 2 series only match 204, 226, 236, 249, 250, 280
| # Or it is not 2, then match:
3(06|43|65) # 3 series only match 306, 343, 365
)
$ # Further Anchor it to the end of the string to keep it to 3 numbers";
// RegexOptions.IgnorePatternWhitespace allows us to put the pattern over multiple lines and comment it. Does not
// affect regex parsing/processing.
var results = Enumerable.Range(0, 2000) // Test to 2000 so we don't get any non 3 digit matches.
.Select(num => num.ToString().PadLeft(3, '0'))
.Where (num => Regex.IsMatch(num, pattern, RegexOptions.IgnorePatternWhitespace))
.ToArray();
Console.WriteLine ("These results found {0}", string.Join(", ", results));
// These results found 204, 226, 236, 249, 250, 280, 306, 343, 365
答案 1 :(得分:0)
我接受了@LucasTrzesniewski的建议,只是循环了可能的值。因为我知道我正在处理三位数的数字,所以我只是通过数字/字符串“000”到“999”循环并检查这样的匹配:
private static void FindRegExMatches(string pattern)
{
for (var i = 0; i < 1000; i++)
{
var numberString = i.ToString().PadLeft(3, '0');
if (!Regex.IsMatch(numberString, pattern)) continue;
Console.WriteLine("Found a match: {0}, numberString);
}
}