2013-07-15 30 views
2

我試圖創建一個機制,可以確定一個字符串匹配的好,並確定最適合。例如:確定最適合正則表達式

輸入

AAAB, AACS, BBBB, ZZZZZ 

4規則

  1. AA *
  2. AAA *
  3. BB *
  4. *

輸出

AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4 

是否有可能用正則表達式來確定呢?

+2

正則表達式無法確定什麼適合'更好',它只能確定什麼適合。您必須將每個字符串與多個正則表達式進行比較,併爲每個匹配成功進行評分。 – Tro

+1

你想實現的東西似乎與[Levenshtein距離](http://en.wikipedia.org/wiki/Levenshtein_distance)的計算類似(但不完全相同)。看看那個維基百科鏈接。你可能會覺得它很有趣。 – Alderath

+0

有沒有更新?或者下面的答案之一幫助你? –

回答

1

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; 
    } 
1

沒有這樣的東西作爲'最適合'正則表達式。如果你想要速度,你唯一能做的就是對不同的正則表達式進行基準測試,看看哪一個是最快的。

更新: 在看到你真正想要的。這不能用正則表達式完成,這需要使用通常的邏輯來完成。

0

不與正則表達式。它只會匹配或不匹配。沒有「更好」匹配的概念。但是,如果您事先知道正則表達式,則可以確定哪些正則表達式更嚴格。

只要檢查是否有匹配的每一個,然後選擇最嚴格的匹配。在你的例子來說:

2 > (1 = 3) > 4

如果2曾經獲得匹配的,它是最適合的。 13永遠不能匹配相同的東西,但它們同樣嚴格。 4是最不嚴格的,因此只會是最適合的,如果它是唯一的匹配。

0

從你的例子看來,你只是想找到最合適的一個。

我建議按照特異性的升序創建一個正則表的列表,並在您的測試用例上運行多遍。成功的第一個正則表達式將是「最合適的」。

在你給了,你可以命令你的正則表達式如下的例子:

  1. BB *
  2. AAA *
  3. AA *
  4. *

然後,比如說,測試用例AACS,你會發現它不匹配正則表達式1或正則表達式2,但它確實匹配了正則表達式3.所以最適合的是正則表達式3,儘管它會匹配正則表達式4如果它已經得到那麼多。

當然,這取決於您使用的正則表達式,並且您必須自行決定如何訂購正則表達式。