2010-12-06 15 views
4

具有任意正則表達式如何生成匹配(或不匹配)給定正則表達式的隨機文本序列?我對理論和實際使用感興趣(需要在.NET上下文中改進我的測試),因此我們將欣賞鏈接到文章或現有庫。看它生成與給定正則表達式匹配的隨機序列

+4

我不知道一個合適的.NET庫,但嘗試在StackOverflow中搜索「xeger」;這可能會給你一些指示。 xeger是一個Java庫,用於從給定的正則表達式中生成字符串。 – 2010-12-06 07:52:11

回答

3

從純理論的角度來看,正則表達式是等效於理性語言,這是在以下基礎上構建:

  • {}(無字的語言)是合理的。
  • {a}(使用單一一個字的字母語言)是合理的。
  • 如果LM是兩種理性語言,那麼它們的聯合(LM中的詞)是合理的。
  • 如果LM兩種理性語言,那麼它們的級聯LM(通過從前面加上ML一個單詞到字構造的話)也是合理的。
  • 如果L是一種合理的語言,那麼L*(通過連接來自語言L的任何數量的詞構造的詞)也是合理的。

此建設性的方法補充了正則表達式識別/匹配方法,並且有助於構建遞歸與表達式匹配的話:

  • make({}) = ""
  • make({a}) = "a"
  • make(A|B) = flip-coin ? make(A) : make(B)
  • make(AB) = make(A) + make(B)
  • make(A*) = flip-coin ? "" : make(A) + make(A*)
1

的一種方式是,每一個正則表達式(我相信)被表示爲一個有限狀態機中的狀態之間的每個過渡由消耗一個或多個字符(或者零字符也是有效的?龍自從我研究這個以來的時間)。

所以,去了解這一個辦法是想或正則表達式轉換成有限狀態機和狀態移動到狀態,隨機選擇的轉變,直到你打一個有效的最終狀態。

當然,我不知道這個方法實際上是如何可行的是代碼,或任何這樣的庫是否存在。

http://lara.epfl.ch/dokuwiki/equivalence_of_finite_state_machine_and_regular_expression_languages

1

在.NET中,你可能也想看看項目Fare。它完全符合你的描述。

這裏是如何使用它:

var xeger = new Xeger(pattern); 
var match = xeger.Generate(); 

Regex.IsMatch(match, pattern); 
// Prints -> true 

既然你提到的單元測試,你也可以考慮使用AutoFixture曾經你裝飾一個屬性(或字段)的[RegularExpression]屬性將分配與正則表達式匹配的值。