Шаблон регулярного выражения для поиска с включением и исключением - PullRequest
2 голосов
/ 15 марта 2010

Я работаю над шаблоном Regex для поиска, который должен позволять дополнительный знак «+» для включения в поиск и знак «-» для исключения из поиска.Например: + apple orange -peach следует искать яблоки и апельсины, а не персики.Также шаблон должен учитывать фразы в двойных кавычках, смешанные с отдельными словами, например: «красное яблоко» - «черный виноград» + апельсин - вы получите идею, такую ​​же, как и большинство запросов в Интернете.Итак, я использую 2 регулярных выражения, во-первых, чтобы выбрать все негативы, что просто, потому что требуется '-':

(?<=[\-]"?)((?<=")(?<exclude>[^"]+)|(?<exclude>[^\s,\+\-"]+))

И, во-вторых, чтобы выбрать позитивы, и это немного сложнее, потому что '+'необязательно:

((?<=[\+\s]")(?<include>[^\s"\+\-][^"]+))|(?<include>(?<![\-\w]"?)([\w][^,\s\-\+]+))(?<!")

В случае положительного поиска у меня возникают проблемы, он прекрасно работает, когда я запускаю его в RegexBuddy, но при попытке в .Net шаблон выбирает второе слово из отрицательных критериев, дляпример в - "черный виноград", он берет слово "виноград", даже если он заканчивается двойной кавычкой.

Есть предложения?

1 Ответ

1 голос
/ 15 марта 2010

Попробуйте это выражение:

[\+-]?(\w+|"[\w\s]+")

Начинается с + или -, необязательно, затем сопоставляет любое слово или любое слово с пробелами внутри кавычек.
Еще один совет: чтобы поэкспериментировать с регулярными выражениями, скачайте инструмент вроде Expresso или The Regulator .

Вот пример использования именованных групп, поэтому вы разделяете знак и значение непосредственно с помощью регулярного выражения:

static void Main(string[] args) {
    string test = "\"red apple\" -\"black grape\" +orange";
    Regex r = new Regex( "(?<sign>[\\+-]?)((?<value>\\w+)|\"(?<value>[\\w\\s]+)\")",RegexOptions.Compiled);

    foreach (Match m in r.Matches(test)) {
        Console.WriteLine(m.Groups["sign"]);
        Console.WriteLine(m.Groups["value"]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...