Регулярное выражение, которое обрабатывает строки в кавычках и двойные кавычки для дюймов

Я пишу небольшой поиск по каталогу продуктов веб-сайта и использую регулярное выражение, чтобы определить, есть ли какие-либо строки, такие как «точная поисковая фраза», включенные в текст из текстового поля поиска. Регулярное выражение, которое я сейчас использую:

List<string> searchTermList = searchTerm.Trim().ToLower().Split(new Char[] { ' ' }).ToList();

foreach (Match match in Regex.Matches(searchTerm, "\"([^\"]*)\""))
{
//irrelevant code
}

Этот код прекрасно работает, пока я не найду что-то вроде:
8" tortilla "stone ground"

Результат, который я хотел бы получить в качестве совпадения, будет
"stone ground"

но вместо этого я получаю
" tortilla ".

Другие сообщения, которые я нашел для подобных вопросов, избегали двойных кавычек для дюймов, но у меня нет никакого способа надежно избежать кавычек, подобных этим примерам. Лучший вариант из других статей, которые я нашел, заключался в том, чтобы экранировать его, если он следует за числом, но пользователи могли искать такие вещи, как "burger 3-1" в кавычках, что было бы неправильно, чтобы в этом случае экранировать последнюю кавычку.

Я хотел бы каким-то образом узнать, предшествует ли строке внутри набора кавычек пробел или пустая строка (если единственным текстом поиска является фраза в кавычках), но я неопытен и борюсь с регулярным выражением, и я чувствую, что это мой лучший вариант для решения чего-то вроде этого. Любая помощь/указатели?


person NSchocker    schedule 11.07.2014    source источник
comment
Можете ли вы использовать [^0-9]\", чтобы найти ", которому не предшествует число? Или как насчет \s\" вместо ", которому предшествует пробел?   -  person Jonny    schedule 11.07.2014
comment
Нет. Я включил пример гамбургера 3-1 выше, где кто-то может искать точную фразу, которая заканчивается числом, поэтому в таких случаях я все равно хочу, чтобы была найдена вторая цитата.   -  person NSchocker    schedule 11.07.2014
comment
Извините, неправильно прочитал этот бит   -  person Jonny    schedule 11.07.2014
comment
Я думаю, что я бы искал что-то вроде \s\, если ему предшествует пробел или ничего. Будет ли предшествовавшее ничем пустое место считаться пробелом?   -  person NSchocker    schedule 11.07.2014
comment
Я не думаю, что это можно решить в чистом регулярном выражении. Возможно, вы сможете сделать это с помощью оценщика совпадений, который исключает совпадения, которые выглядят как дюймы, а затем попытаться соединить оставшиеся совпадения.   -  person Brian Reischl    schedule 11.07.2014
comment
У меня есть проблема, которую, я думаю, я могу решить с помощью регулярного выражения... Теперь у меня есть две проблемы. :)   -  person Chris Hinton    schedule 11.07.2014
comment
В какую поисковую систему вы собираетесь отправлять эти термины? Системы реального текстового поиска, такие как Lucene или SQL FTS, могут в любом случае удалять символы кавычек и двойных кавычек, поэтому вы можете просто полностью удалить число, за которым следует кавычка, из строки поиска, что проще, чем то, что вы' повторно пытаюсь сделать.   -  person Brian Reischl    schedule 13.07.2014


Ответы (1)


Попробуйте это: (обновлено)

Сначала используйте это выражение, чтобы найти и заменить (в javascript) все строки, которые имеют шаблон «9», «9,9», «9-9», на шаблон «9», «9,9», «9-9».

\"[0-9.-]*\"

Далее заменить все

([^a-z,0-9,',"])([\s]*)\" 

только с одним ". Это удалит все ненужные пробелы.

Затем возьмите эту новую отформатированную строку и примените

 \"[^\s]([^\"]*)[^\s]\"

Это касается всех сценариев. Просто убедитесь, что вы берете исходную строку в новую переменную и играете с ней, иначе вы в конечном итоге измените исходное значение.

Вот пример строки, которую я использовал для проверки приведенных выше выражений. У меня не было времени писать саму функцию javascript. Пожалуйста, опубликуйте функцию, если вы заставите ее работать, используя приведенные выше выражения.

8" "шлифовальная машина bosch", bosch "8" шлифовальная машина "и" bosch шлифовальная машина "8" "99" "9,9" "9-7"

Я использую веб-сайт для тестирования своих регулярных выражений: http://www.regexr.com/.

person sbjumani    schedule 11.07.2014
comment
Лучше, но не идеально. например, если дюймы находятся внутри кавычек: bosch "8" grinder" - person Brian Reischl; 11.07.2014
comment
Похоже, этот ответ - это маршрут, по которому мне придется идти сейчас. 8" "bosch grinder" , bosch "8" grinder" и "bosch grinder" 8" могут быть вариантами, и я не вижу никакого способа приспособить все три из них в моей ситуации. На данный момент это лучший вариант для меня. - person NSchocker; 11.07.2014
comment
Научите своих пользователей использовать правильную грамматическую структуру. Кроме того, во время ввода данных вы можете выполнить ту же проверку и отобразить значимое сообщение, чтобы убедиться, что входные данные имеют хорошее качество. Не всегда пытайтесь решить проблемы с неправильными данными или структурой, старайтесь в первую очередь избегать этого. - person sbjumani; 12.07.2014
comment
@BrianReischl дайте мне знать, что вы думаете об обновленном решении, которое я опубликовал. - person sbjumani; 13.07.2014
comment
Я думаю, что это лучше, но я все еще не думаю, что эта проблема действительно подходит для регулярных выражений. - person Brian Reischl; 13.07.2014