如何以任意顺序搜索模式?

时间:2016-01-13 07:45:23

标签: 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,5),(6,7)) (11,(12,13))

非常像Regex的作品,对吧?

你会定义一些名为 isPrime(x)的函数,并在你需要检查下一个输入元素是否为实数素数时使用它(因此它与对象或对象有某种相等性)空间)

到目前为止我创建的内容

我在C#中创建了类似于 Regex 类的 ObjectRegex 类。它接受上面的模式并执行与之相关的谓词来识别对象。 它工作得很好,但问题是它可以工作任何类型的序列 TValue 应该转换为 string 才能传递给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]方法来完成,但我认为它会破坏其他所有内容,因为你只能替换一个实例的方法。

1 个答案:

答案 0 :(得分:1)

字符串继承

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

ORegex

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

目前,它支持基本的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