Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示正则表达式模式的所有可能匹配项_C#_Regex - Fatal编程技术网

C# 显示正则表达式模式的所有可能匹配项

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#中是否有方法生成与此模式匹配的所

我使用以下正则表达式模式来确定电话号码的一些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#中是否有方法生成与此模式匹配的所有数字?顺便说一句,我知道我可以循环通过数字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我更新了答案,为你提供了不同的模式/处理风格。