C # библиотека для удобочитаемого сопоставления с образцом? - PullRequest
13 голосов
/ 25 марта 2011

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

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

(this AND that) OR "theother"

, где "this" и ""являются похожими выражениями, и" theother "является точным соответствием из-за кавычек.

ОБНОВЛЕНИЕ: Хорошо, просто чтобы быть немного понятнее.Я хочу, чтобы это объяснялось тем, что конечные пользователи могут вводить свои собственные шаблоны в виде строковых значений.Таким образом, я стремлюсь к чему-то, что работает аналогично регулярному выражению, но использует читаемые человеком строки, которые мои пользователи легко поймут

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

Ответы [ 7 ]

4 голосов
/ 25 марта 2011

Я читал эту статью некоторое время назад. Это звучит так, как вы просите.

Читаемые регулярные выражения

Который, глядя на ваш запрос, должен был бы создать сопоставление терминологии, удобной для пользователя, и свободный интерфейс этой библиотеки.

Это дополнительный уровень абстракции, правда, но я лично предпочел бы читать беглую "промежуточную стадию", чем автоматически сгенерированное регулярное выражение: s

1 голос
/ 09 ноября 2017

Существует хорошая библиотека с именем 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");
1 голос
/ 31 августа 2011

А как насчет этого?

Изменить это:

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 голос
/ 05 апреля 2011

Несколько лет назад я искал способ определения более удобочитаемого / интуитивно понятного синтаксиса для запросов полнотекстового поиска (SQL Server FTS).Затем я нашел эту статью: Нормализация условий полнотекстового поиска SQL Server .

Надеюсь, это может быть для вас таким же полезным, как и для меня.

Вам нужно, чтобы пользователи просто вводили свои критерии поиска, как в Google.Некоторые слова, может быть, некоторые цитируемые фразы, может быть, несколько операторов, и это просто работает.Так что делать?Что ж, вы могли бы попытаться разобрать и переставить смешанный пакет с дерьмом, который ваши пользователи отправят в правильную нормальную форму, которую CONTAINS и CONTAINSTABLE примут.

1 голос
/ 25 марта 2011

Что ж, после долгих поисков я не смог найти именно то, что мне было нужно, но мне нужно было что-то работать довольно быстро, и из-за того, что система, которую я использую, уже имеет соответствующие библиотеки DLL,Я закончил тем, что использовал Lucene.NET для создания временного индекса, содержащего один документ с соответствующими полями, которые мне нужны для поиска.Затем я могу выполнить тот тип запроса, который мне нужен, и проверить, нет ли совпадений.Используя класс RAMDirectory, я смог создать индекс в памяти и избавиться от него после поиска, поэтому файлы индекса не нужно записывать на диск.

Я уверен, что, возможно, существуют менее интенсивные способычтобы достичь этого, но, как я уже сказал, это лучшее, что я мог придумать за то время, которое у меня было.

Спасибо всем за их предложения, и я все еще хотел бы знать, есть ли лучший способделать это?

0 голосов
/ 25 марта 2011

Я думаю, что в 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);
}

ура!

0 голосов
/ 25 марта 2011

Visual Basic имеет оператор LIKE.Это гораздо дружелюбнее, чем RegEx.Когда я кодирую в VB.NET, я обычно могу полностью исключить необходимость использования RegEx с помощью LIKE.В C # вы можете либо болезненно иметь дело с RegEx, либо создать библиотеку VB, которая использует более удобный LIKE, и ссылаться на нее в своем проекте C #.

Примечание: вам придется использовать RegEx для сложного сопоставления, но LIKE работает с большинством случаев, с которыми вы сталкиваетесь.

...