Разбор строки поиска - нерегулярная проблема. Это означает, что хотя регулярное выражение может оказаться обманчиво близким, оно не займет у вас весь путь без использования проприетарных расширений, создания не поддерживаемого беспорядка в выражении, оставляя открытыми неприятные крайние случаи, которые не работают так, как вам хочется или какая-то комбинация из трех.
Вместо этого есть три правильных способа справиться с этим:
- Используйте стороннее решение, такое как Lucene.
- Создайте грамматику через что-то вроде antlr.
- Создайте свой собственный конечный автомат.
Для проблемы такого уровня (и если предположить, что поиск достаточно важен для того, что вы делаете, чтобы действительно захотеть реализовать его самостоятельно), я бы, вероятно, выбрал вариант 3. Это имеет больше смысла, когда вы понимаете, что обычный выражения сами по себе являются инструкциями по настройке конечных автоматов. Все, что вы делаете, это встраиваете это прямо в ваш код. Это должно дать вам возможность настраивать производительность и функции, не требуя добавления большего компонента лексера в ваш код.
Для примера того, как вы можете это сделать, посмотрите на мой ответ на этот вопрос:
Чтение файлов CSV в C #
Я хотел бы создать конечный автомат для анализа строки символ за символом. Это будет самый простой способ реализовать полностью правильное решение, а также привести к быстрейшему коду.