[英]How to search patterns in arbitrary sequences?
Regex僅適用於字符串,但如果該功能不僅可以擴展到字符而且可以擴展到對象甚至更多功能呢? 假設我們的對象是整數,它們可以是任何順序:
1 2 3 4 5 6 7 8 9 10 11 12 13
您要解決的任務是找到素數對 (或類似模式搜索任務),如下所示:
{prime}{anyNumber}{prime}
所以答案是這樣的:
(3,4,5) (5,6,7) (11,12,13)
或者是素數鏈的一個更復雜的例子:
{prime}({anyNumber}{prime})+
回答:
(3,(4,5),(6,7)) (11,(12,13))
非常像正則表達式的工作,對吧?
會發生的是你定義了一個名為isPrime(x)的函數,並在需要檢查下一個輸入元素是否為實數素數時使用它(因此它與對象或對象空間有某種相等性)
到目前為止我創造了什么
我在C#中創建了類似於Regex類的ObjectRegex類。 它接受上面的模式並執行與之相關的謂詞來識別對象。 它工作得很好,但問題是它可以工作任何類型的TValue序列應該轉換為字符串才能傳遞給Regex模式,為此我應該將所有謂詞應用於整個序列。 O(n * m)畢竟是一個壞主意....
我決定以艱難的方式解決它....並嘗試繼承字符串,這是密封的,繼承被禁止。 從這個繼承的類中需要的是覆蓋訪問器
char this[int index] {get;}
為了延遲執行謂詞的好處,它實際上是有意義的。
那么,任何想法如何制作呢? 我喜歡.NET Regex和它的語法,有沒有辦法繞過這個字符串詛咒和欺騙引擎? 反思可能還是一些我不知道的鐵桿?
更新1
我發現這篇文章http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time並認為可以通過替換這個[int index]方法來完成通過我的代碼,但我認為它會破壞其他一切,因為你只能替換一個實例的方法。
經過一些研究,我發現優化現有正則表達式的想法是不可能的。 這是因為即使我知道字符串中的索引,我仍然無法訪問正則表達式自動機中的可能狀態,我應該嘗試過濾不必要的計算。
至於回答,我決定實現類似於Microsoft Regex引擎的我自己的引擎。 語法與Microsoft Regex語法相同。 您可以在Nuget和github上找到更多信息和示例:
目前,它支持基本的Regex引擎功能以及一些流行的功能,如超前和捕獲。
public static bool IsPrime(int number)
{
int boundary = (int)Math.Floor(Math.Sqrt(number));
if (number == 1) return false;
if (number == 2) return true;
for (int i = 2; i <= boundary; ++i)
{
if (number % i == 0) return false;
}
return true;
}
public void PrimeTest()
{
var oregex = new ORegex<int>("{0}(.{0})*", IsPrime);
var input = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
foreach (var match in oregex.Matches(input))
{
Trace.WriteLine(string.Join(",", match.Values));
}
}
//OUTPUT:
//2
//3,4,5,6,7
//11,12,13
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.