Библиотека С# для сопоставления с читаемым человеком?

Кто-нибудь знает библиотеку С# для сопоставления человеческих читаемых паттернов? Аналогично регулярному выражению, но более дружелюбно?

Учитывая строковое значение, я хочу иметь возможность сопоставить его с шаблоном в строках:

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