如何在任意序列中搜索模式?

正则表达式仅限于字符串,但如果该function不仅可以扩展到字符而且可以扩展到对象甚至更多function呢? 假设我们的对象是整数,它们可以是任何顺序:

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模式,为此我应该将ALL谓词应用于整个序列。 O(n * m)毕竟是一个坏主意….

我决定以艰难的方式解决它….并尝试inheritance字符串,这是密封的,inheritance被禁止。 从这个inheritance的类中需要的是覆盖访问器

 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]方法来完成通过我的代码,但我认为它会破坏其他一切,因为你只能替换一个实例的方法。

字符串inheritance

经过一些研究,我发现优化现有正则表达式的想法是不可能的。 这是因为即使我知道字符串中的索引,我仍然无法访问正则表达式自动机中的可能状态,我应该尝试过滤不必要的计算。

ORegex

至于回答,我决定实现类似于Microsoft Regex引擎的自己的引擎。 语法与Microsoft Regex语法相同。 您可以在Nugetgithub上找到更多信息和示例:

目前,它支持基本的Regex引擎function以及一些流行的function,如超前和捕获。

 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("{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