【问题标题】:C# library for human readable pattern matching?用于人类可读模式匹配的 C# 库?
【发布时间】:2011-03-25 13:26:29
【问题描述】:

有人知道用于匹配人类可读模式的 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);

【问题讨论】:

  • 您有什么要求?我不知道任何这样的库,但我认为如果你清楚你的要求,很容易在正则表达式匹配上编写一个包装器,或者简单地使用正则表达式本身。
  • 你的意思是,类似于用于声明正则表达式的流畅接口吗? flimflan.com/blog/ReadableRegularExpressions.aspx
  • @MattC 优秀的链接可以作为答案
  • 我正在开发一个系统,该系统要求用户插入自定义查询来过滤他们将收到的数据(想想电子邮件过滤器)。我的用户不太可能知道 RegEx,但是上面突出显示的内容会更容易向他们解释。与电子邮件过滤器类似,对象的各种属性将与查询匹配,如果匹配成功,用户将收到该信息,否则将被丢弃。
  • 很遗憾我只能提出这个问题一次。这是我们长期以来一直需要的东西。

标签: c# .net regex expression-trees


【解决方案1】:

我不久前读过这篇文章。听起来与您的要求相符。

Readable Regular Expressions

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

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

【讨论】:

    【解决方案2】:

    有一个很好的库叫做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");
    

    【讨论】:

      【解决方案3】:

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

      我确信可能有不那么密集的方法来实现这一点,但正如我所说,这是我能想到的最好的方法。

      感谢大家的建议,我还是想知道有没有更好的办法呢?

      【讨论】:

        【解决方案4】:

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

        我希望它对你和我一样有帮助。

        您想要的只是让用户 只需输入他们的搜索条件 就像他们在谷歌一样。一些单词, 也许是一些引用的短语,也许是一些 运营商,让它正常工作。所以, 该怎么办?好吧,你可以尝试 解析并重新排列混合包 废话您的用户将提交到 包含和 CONTAINSTABLE 将接受。

        【讨论】:

          【解决方案5】:

          这个呢?

          改变这个:

          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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 您会创建一个 VB 项目,而不是引用 Microsoft.VisualBasic.dll 并调用 Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString 来污染您的 C# 代码?疯了。
            • @Ben Voigt:不,不是疯了。我发现 VB.NET 项目中的 VB.NET 语法更容易。 LINQ 语法也是如此,您必须为 XML Literals 使用 VB.NET 项目。这取决于需要。我并不羞于将 Microsoft.VisualBasic 引用添加到 C# 项目。我一直这样做,因为我有一个复制 VB 的 My 的 C# My 命名空间,以便更轻松地在两种语言之间重用源代码。我还使用 ILMerge 在适当的时候将程序集组合成一个可执行文件或 dll。
            【解决方案7】:

            我认为 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);
            }
            

            干杯!

            【讨论】:

            • 嗯,似乎“人类可读”可以解释。我认为 RegEx 是人类可读的,因为我可以阅读和修改它。问题中的关键字是“友好”
            猜你喜欢
            • 1970-01-01
            • 2010-11-21
            • 2014-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多