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

16

有没有人知道一个C#库可以用来匹配人类可读的模式?类似于正则表达式,但更友好易懂?

给定一个字符串值,我想能够将其与以下模式相匹配:

(this AND that) OR "theother"

这里的"this"和"that"是LIKE表达式,“theother”因为有引号,所以是精确匹配。

更新: 好的,让我再更清楚一些。我想要这个是为了允许最终用户输入他们自己的模式,作为字符串值。因此,我需要的是一些类似于正则表达式的东西,但使用人类可读的字符串,这样我的用户能够轻松理解。

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

你有什么要求吗?我不知道是否有这样的库,但我认为如果你对自己的需求很清楚,那么编写一个正则表达式匹配的包装器或者直接使用正则表达式本身是很容易的。 - Hari Menon
5
你的意思是,希望有一种类似于流畅接口的方式来声明正则表达式吗?http://flimflan.com/blog/ReadableRegularExpressions.aspx - MattC
@MattC 出色的链接可以作为答案。 - CharlesB
我正在开发一个系统,需要用户插入自定义查询以过滤他们将接收到的数据(类似于电子邮件过滤器)。我的用户很可能不知道正则表达式,但是像上面突出显示的那样的东西会更容易向他们解释。与电子邮件过滤器类似,对象的各种属性将与查询匹配,如果匹配成功,用户将接收到该信息,否则将被丢弃。 - Matt Brailsford
真遗憾我只能将这个问题顶上去一次。这是我们长期以来一直需要的东西。 - JohnC
我也想要一个好的答案。现在打算自己尝试解决。 - Daniel Williams
7个回答

4
我之前读过这篇文章,它与你的问题有些相关。你需要创建一个映射表,将“用户友好”的术语和这个库的流畅接口联系起来。
这是一层额外的抽象,但我个人宁愿阅读流畅的“中间阶段”而不是自动生成的正则表达式 :s。
文章链接:可读性强的正则表达式

3

有一个很好的库叫做VerbalExpressions,它基本上使用流畅的表达式构建正则表达式。以下是一个示例:

// 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");

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


1

几年前,我正在寻找一种定义全文搜索查询(SQL Server FTS)更易读/直观的语法的方法。然后我发现了这篇文章:规范化 SQL Server 全文搜索条件

我希望它对你有用,就像对我一样。

你想要的是用户只需像在 Google 中一样输入他们的搜索条件。一些单词,可能是一些引用的短语,也许还有一些运算符,然后它就可以工作了。那么,该怎么办呢?嗯,你可以尝试解析和重新排列用户提交的混合垃圾,使其成为 CONTAINS 和 CONTAINSTABLE 可接受的有效正常形式。


1

经过大量搜索,我没有找到完全符合我的要求的东西,但是由于需要尽快让某些东西工作,并且由于我正在使用的系统已经有了相关的DLL,所以我最终使用Lucene.NET创建了一个临时索引,其中包含一个单独的文档和我需要搜索的相关字段。然后我可以对其执行所需的查询,并检查是否有任何匹配项。通过使用RAMDirectory类,我能够在内存中创建索引,并在查找后将其处理掉,因此不必将索引文件写入磁盘。

我相信可能有更少耗费资源的方法来实现这一点,但正如我所说,这是我在拥有的时间内想出的最好方法。

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


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);
}

干杯!


嗯,看起来“易读性”是可以解释的。我认为正则表达式是易读的,因为我可以阅读和修改它。问题中的关键词是“更友好”。 - AMissico

0

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

注意:对于复杂匹配,您将不得不使用正则表达式,但是LIKE可以处理您遇到的大多数情况。


2
你会创建一个VB项目,而不是在C#代码中引用Microsoft.VisualBasic.dll并调用Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString吗?这太疯狂了。 - Ben Voigt
@Ben Voigt:不,这并不疯狂。我发现在VB.NET项目中,VB.NET语法更容易使用。LINQ语法也是如此,您必须使用VB.NET项目来使用XML文本。这取决于需求。我不介意将Microsoft.VisualBasic引用添加到C#项目中。我经常这样做,因为我有一个C#“My”命名空间,可以复制VB的“My”,使两种语言之间的源代码重用更加容易。我还使用ILMerge将程序集合并为一个可执行文件或dll,以适当的方式进行组合。 - AMissico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接