簡體   English   中英

顯示正則表達式模式的所有可能匹配項

[英]Display all possible matches for a regex pattern

我有以下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,並根據模式檢查每個數字,但有沒有更清晰的內置方式來生成列表或匹配數組?

ie - {"204","226","236",...}

不,沒有現成的工具來確定給定正則表達式模式的所有匹配。 蠻力是測試模式的唯一方法。

更新

目前還不清楚為什么你使用(?: ) :)這是“匹配但不捕獲”。 它用於錨定一個匹配,例如拿這個電話文本phone:303-867-5309 ,我們不關心phone:但我們想要這個號碼。

使用的模式是

(?: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

我接受了@LucasTrzesniewski的建議,然后循環查看可能的值。 因為我知道我正在處理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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM