2010-03-14 4 views
2

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

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

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

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

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

Любые предложения?

+1

Это действительно не работа для регулярных выражений. Простой поиск строк выполнил бы эту работу и упростил бы все это. –

+0

Я должен согласиться. Вы все равно хотите, чтобы все было от строки, просто заходите на очень простой и простой в использовании парсер. Вы избавляете себя от головной боли, и это, вероятно, даже намного быстрее. –

+0

Я с Максом на этом, регулярное выражение - это круто, но у них есть свое место. Простой синтаксический анализатор строк или сканирование будет намного проще. – zellio

ответ

1

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

[\+-]?(\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"]); 
    } 
} 
+0

Приятный и простой, но есть причина, почему у меня есть внешний вид и внешний вид в моем шаблоне, так что мне не нужно выбирать + - и двойные кавычки в моем результате. для исправления моего положительного шаблона поиска: ((? <= [\ + \ s] ") (? [^ \ s \" \ + \ -] [^ "] +)) (? = \") | ((? [\ w] [^, \ s \ - \ + "] +) (?! [\ w"]) –

Смежные вопросы