C# 显示正则表达式模式的所有可能匹配项
我使用以下正则表达式模式来确定电话号码的一些3位数交换:C# 显示正则表达式模式的所有可能匹配项,c#,regex,C#,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)1247 1247:0[59]1248]78 1248[1247]1248[1247]90] 它看起来相当令人望而生畏,但它只能产生大约40或50个数字。在C#中是否有方法生成与此模式匹配的所
(?: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)1247 1247:0[59]1248]78 1248[1247]1248[1247]90]
它看起来相当令人望而生畏,但它只能产生大约40或50个数字。在C#中是否有方法生成与此模式匹配的所有数字?顺便说一句,我知道我可以循环通过数字001到999,并根据模式检查每个数字,但是是否有更干净的内置方法来生成匹配列表或数组
ie-{“204”、“226”、“236”、…}
不,没有现成的工具来确定给定正则表达式模式的所有匹配项。暴力是测试模式的唯一方法
使现代化
不清楚为什么要使用“匹配但不捕获”的(?:)
。它用于锚定匹配,例如,以此电话文本电话:303-867-5309
为例,我们不关心电话:
,但需要号码
使用的模式将是
(?:phone\:)(\d{3}-\d{3}-\d{4})
这将匹配整条线路,但返回的捕获将只是电话号码的第二个匹配项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
我接受了@lucastrezesniewski的建议,只是循环了一下可能的值。因为我知道我在处理w/3位数的数字,所以我只是在数字/字符串“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);
}
}
私有静态void findregxmatches(字符串模式)
{
对于(变量i=0;i<1000;i++)
{
var numberString=i.ToString().PadLeft(3,'0');
如果(!Regex.IsMatch(numberString,pattern))继续;
WriteLine(“找到匹配项:{0},numberString);
}
}
的可能重复项。只需浏览所有可能的路径。没有任何内置项。谢谢@Lucastzesniewski-这是一个很酷的工具,如果只是为了视觉帮助的话。@WEFX我想你可以将正则表达式转换为DFA(除非它是真正的高级正则表达式)然后你可以遍历DFA。@Millie正是如此。注意,我上面评论中的铁路图实际上是一个DFA。这个特定的模式使它变得非常简单。@WEFX我更新了答案,为你提供了不同的模式/处理风格。