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

C# 如何在任意序列中搜索模式?,c#,regex,inheritance,C#,Regex,Inheritance,正则表达式仅在字符串上,但如果该功能不仅可以扩展到字符,还可以扩展到对象,甚至可以扩展到函数呢? 假设我们的对象是整数,它们可以是任意顺序: 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

正则表达式仅在字符串上,但如果该功能不仅可以扩展到字符,还可以扩展到对象,甚至可以扩展到函数呢? 假设我们的对象是整数,它们可以是任意顺序:

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)的函数,并在需要检查下一个输入元素是否实际为素数时使用它(因此它与对象或对象空间有某种等价性)

到目前为止我创造了什么

我创建了ObjectRegex类,类似于C#中的Regex类。它接受上面的模式,并执行与其关联的谓词来标识对象。 它工作得非常好,但问题是它要工作,TValue类型的任何序列都应该在传递给Regex模式之前转换为string,为此,我应该对整个序列应用所有谓词。O(n*m)毕竟是个坏主意

我决定用艰难的方式来解决这个问题,并尝试继承字符串,它是密封的,并且禁止继承。这个继承类需要的是重写访问器

char this[int index] {get;}
为了使谓词的执行延迟到实际有意义的时刻

那么,你知道怎么做吗?我喜欢.NET正则表达式及其语法,有没有办法绕过这个字符串诅咒和欺骗引擎?也许是反思,或者是一些我不知道的核心

更新1

我找到了这篇文章 我认为可以用我的代码替换这个[int index]方法,但我认为它会破坏其他所有东西,因为你不能只替换一个实例的方法。

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

奥雷格克斯 至于答案,我决定实现我自己的引擎,类似于MicrosoftRegex引擎。语法与Microsoft正则表达式语法相同。您可以在和找到更多信息和示例:

目前,它支持基本的正则表达式引擎功能,还支持一些流行的功能,如前瞻和捕获

例子
公共静态bool IsPrime(整数)
{
int boundary=(int)Math.Floor(Math.Sqrt(number));
如果(number==1)返回false;
if(number==2)返回true;

对于(inti=2;i)这个有趣的概念,将正则表达式的思想扩展到任意类型的序列。
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