用于人类可读模式匹配的C#库?

时间:2011-03-25 13:26:29

标签: c# .net regex expression-trees

有人知道C#库是否匹配人类可读模式?与正则表达式相似,但更友好?

给定一个字符串值,我希望能够将它与以下行的模式匹配:

(this AND that) OR "theother"

其中“this”和“that”是LIKE表达式,而“theother”与引号完全匹配。

更新 好的,只是为了更清楚一点。我想要这个的原因是允许最终用户输入他们自己的模式,作为字符串值。因此,我正在使用与regex类似的方式,但使用人类可读的字符串,我的用户将很容易理解

var pattern = "(this AND that) OR \"theother\""; // Could be fetched from textbox
var match = SomeLib.IsMatch(myString, pattern);

7 个答案:

答案 0 :(得分:4)

我前一段时间读过这篇文章。这听起来就像你要问的那样。

Readable Regular Expressions

根据您的要求,您需要创建“用户友好”术语和此库的流畅界面的映射。

这是一个额外的抽象层,但我个人,宁愿阅读一个流畅的“中间阶段”而不是自动生成的正则表达式:s

答案 1 :(得分:1)

好吧,经过大量的搜索,我无法找到我到底的确切内容,但需要快速完成某些工作,并且由于我使用的系统已经具有相关的DLL,我最终使用Lucene.NET创建了一个包含单个文档的临时索引,其中包含我需要搜索的相关字段。然后我可以做我反对它的查询类型,并检查任何匹配。通过使用RAMDirectory类,我能够在内存中创建索引,并在查找后处理它,因此不必将索引文件写入磁盘。

我确信可能没有那么强化的方法来实现这一目标,但正如我所说,这是我能够想到的最好的方式。

感谢大家的建议,我仍然想知道是否有更好的方法可以做到这一点?

答案 2 :(得分:1)

几年前,我一直在寻找一种为全文搜索查询(SQL Server FTS)定义更多可读/直观语法的方法。然后我发现了这篇文章:Normalizing SQL Server Full-text Search Conditions

我希望它对你有所帮助,对我来说也是如此。

  

您想要的只是用户   只需键入他们的搜索条件   就像他们在Google中一样。一些单词,   也许是一些引用的短语,也许是一些   运营商,让它只是工作。所以,   该怎么办?好吧,你可以试试   解析和重新排列混合袋   垃圾你的用户将提交到   CONTAINS和的有效正规形式   CONTAINSTABLE将接受。

答案 3 :(得分:1)

这个怎么样?

改变这个:

Regex socialSecurityNumberCheck = new Regex(@"^\d{3}-?\d{2}-?\d{4}$");

为此:

Regex socialSecurityNumberCheck = new Regex(Pattern.With.AtBeginning
    .Digit.Repeat.Exactly(3)
    .Literal("-").Repeat.Optional
    .Digit.Repeat.Exactly(2)
    .Literal("-").Repeat.Optional
    .Digit.Repeat.Exactly(4)
    .AtEnd);

在此处下载二进制文件:http://flimflan.com/files/ReadableRex_DLL.zip

答案 4 :(得分:1)

有一个名为VerbalExpressions的好库,基本上是从Fluent表达式构造RegEx。这是一个例子:

// Create an example of how to test for correctly formed URLs
var verbEx = new VerbalExpressions()
                 .StartOfLine()
                 .Then( "http" )
                 .Maybe( "s" )
                 .Then( "://" )
                 .Maybe( "www." )
                 .AnythingBut( " " )
                 .EndOfLine();

// Create an example URL
var testMe = "https://www.google.com";

Assert.IsTrue(verbEx.Test( testMe ), "The URL is incorrect");

答案 5 :(得分:0)

Visual Basic有一个LIKE运算符。它比RegEx更友好。当我在VB.NET中编码时,我通常可以通过使用LIKE完全消除对RegEx的需求。在C#中,您可以痛苦地处理RegEx或创建一个使用更友好的LIKE并在C#项目中引用它的VB库。

注意:您必须使用RegEx进行复杂匹配,但LIKE会处理您遇到的大多数情况。

答案 6 :(得分:0)

我认为C#已经具有人类可读的模式匹配器 - 它被称为LINQ。

例如 - LIKE运算符可以这样模拟:

public static void Main (string[] args) {
  var found = "blood fold boot goat cook hole door".
               Split(' ').
               Where(part => part.Contains("oo"));

  foreach (var part in found)
    Console.WriteLine(part);
}

喝彩!