Библиотека С# для сопоставления с читаемым человеком?
Кто-нибудь знает библиотеку С# для сопоставления человеческих читаемых паттернов? Аналогично регулярному выражению, но более дружелюбно?
Учитывая строковое значение, я хочу иметь возможность сопоставить его с шаблоном в строках:
(this AND that) OR "theother"
где "this" и "that" - выражения LIKE, а "theother" - точное соответствие из-за кавычек.
UPDATE:
Хорошо, просто немного лучше. Причина, по которой я хочу это, - позволить конечным пользователям вводить свои собственные шаблоны в качестве значений строк. Поэтому я за чем-то, что работает аналогично регулярному выражению, но использует человеческие читаемые строки, которые мои пользователи легко поймут.
var pattern = "(this AND that) OR \"theother\""; // Could be fetched from textbox
var match = SomeLib.IsMatch(myString, pattern);
Ответы
Ответ 1
Ну, после многих поисков я не смог найти то, что было после, но мне нужно что-то быстро сделать, и из-за того, что у системы, которую я использую, уже есть соответствующие DLL, Я закончил использование Lucene.NET для создания временного индекса, содержащего один документ с соответствующими полями, которые мне нужно найти в нем. Затем я могу выполнить тип запроса, после которого я против, и проверить любые соответствия. Используя класс RAMDirectory, я смог создать индекс в памяти и избавиться от него после поиска, поэтому никакие индексные файлы не должны записываться на диск.
Я уверен, что есть, вероятно, менее интенсивные способы достижения этого, но, как я уже сказал, это лучшее, что я мог придумать за время, которое у меня было.
Спасибо всем за их предложения, и я все равно хотел бы узнать, есть ли лучший способ сделать это?
Ответ 2
Я прочитал эту статью некоторое время назад. Это звучит так, как вы просите.
Считываемые регулярные выражения
Что, глядя на ваш запрос, вам тогда понадобится создать сопоставление "удобной для пользователя" терминологии и свободного интерфейса этой библиотеки.
Это дополнительный слой абстракции, правда, но я лично, скорее прочитал бы беглый "промежуточный этап", чем автогенерированное регулярное выражение: s
Ответ 3
Несколько лет назад я искал способ определить более читаемый/интуитивный синтаксис для полнотекстовых поисковых запросов (SQL Server FTS). Затем я нашел эту статью: Нормализация условий полнотекстового поиска SQL Server.
Я надеюсь, что это может быть так же полезно для вас, как и для меня.
Вы хотите, чтобы пользователи просто введите критерии поиска как в Google. Некоторые слова, возможно, некоторые цитируемые фразы, может быть, несколько операторов, и пусть это просто работает. Так, что делать? Ну, вы могли бы попробовать и разобрать и переставить смешанный пакет ваши пользователи будут представлены в действительная нормальная форма, которая СОДЕРЖИТ и CONTAINSTABLE примет.
Ответ 4
Как насчет этого?
Измените это:
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
Ответ 5
Visual Basic имеет оператор LIKE. Он намного дружелюбнее RegEx. Когда я код в VB.NET, я обычно могу полностью исключить необходимость в RegEx, используя LIKE. В С# вы можете либо болезненно иметь дело с RegEx, либо создать библиотеку VB, которая использует более дружественный LIKE и ссылаться на него в вашем проекте С#.
Примечание: вам придется использовать RegEx для сложного соответствия, но LIKE имеет дело с большинством случаев, с которыми вы сталкиваетесь.
Ответ 6
Я думаю, что у С# уже есть человекочитаемый шаблонный шаблон - он называется 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);
}
ура!
Ответ 7
Существует хорошая библиотека под названием VerbalExpressions, которая в основном создает RegEx из выражения Fluent. Вот пример:
// 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");