我試圖創建一個機制,可以確定一個字符串匹配的好,並確定最適合。例如:確定最適合正則表達式
輸入:
AAAB, AACS, BBBB, ZZZZZ
4規則:
- AA *
- AAA *
- BB *
- *
輸出:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
是否有可能用正則表達式來確定呢?
我試圖創建一個機制,可以確定一個字符串匹配的好,並確定最適合。例如:確定最適合正則表達式
輸入:
AAAB, AACS, BBBB, ZZZZZ
4規則:
輸出:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
是否有可能用正則表達式來確定呢?
Hej, 我創建了以下代碼。
首先我替換所有特殊字符,然後檢查它是否匹配,當匹配時我要確定匹配有多大,我通過計算*字符旁邊的剩餘字符來做到這一點。
public Int32 GetMatchQuota(string d)
{
Int32 retval = -1;
string regMask = String.Format("^{0}$", Destination.Replace(".", "\\.").Replace("*", ".*").Replace("%", "."));
if (Regex.IsMatch(d, regMask, RegexOptions.IgnoreCase))
{
retval = regMask.Replace("*", string.Empty).Length;
if (!regMask.Contains("*") || !regMask.Contains("%"))
{
retval += 1;
}
}
return retval;
}
沒有這樣的東西作爲'最適合'正則表達式。如果你想要速度,你唯一能做的就是對不同的正則表達式進行基準測試,看看哪一個是最快的。
更新: 在看到你真正想要的。這不能用正則表達式完成,這需要使用通常的邏輯來完成。
不與正則表達式。它只會匹配或不匹配。沒有「更好」匹配的概念。但是,如果您事先知道正則表達式,則可以確定哪些正則表達式更嚴格。
只要檢查是否有匹配的每一個,然後選擇最嚴格的匹配。在你的例子來說:
2 > (1 = 3) > 4
如果2
曾經獲得匹配的,它是最適合的。 1
和3
永遠不能匹配相同的東西,但它們同樣嚴格。 4
是最不嚴格的,因此只會是最適合的,如果它是唯一的匹配。
從你的例子看來,你只是想找到最合適的一個。
我建議按照特異性的升序創建一個正則表的列表,並在您的測試用例上運行多遍。成功的第一個正則表達式將是「最合適的」。
在你給了,你可以命令你的正則表達式如下的例子:
然後,比如說,測試用例AACS,你會發現它不匹配正則表達式1或正則表達式2,但它確實匹配了正則表達式3.所以最適合的是正則表達式3,儘管它會匹配正則表達式4如果它已經得到那麼多。
當然,這取決於您使用的正則表達式,並且您必須自行決定如何訂購正則表達式。
正則表達式無法確定什麼適合'更好',它只能確定什麼適合。您必須將每個字符串與多個正則表達式進行比較,併爲每個匹配成功進行評分。 – Tro
你想實現的東西似乎與[Levenshtein距離](http://en.wikipedia.org/wiki/Levenshtein_distance)的計算類似(但不完全相同)。看看那個維基百科鏈接。你可能會覺得它很有趣。 – Alderath
有沒有更新?或者下面的答案之一幫助你? –