有人知道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);
答案 0 :(得分:4)
我前一段时间读过这篇文章。这听起来就像你要问的那样。
根据您的要求,您需要创建“用户友好”术语和此库的流畅界面的映射。
这是一个额外的抽象层,但我个人,宁愿阅读一个流畅的“中间阶段”而不是自动生成的正则表达式: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);
答案 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);
}
喝彩!