Как я могу узнать, содержит ли одна строка свободно другую (регистр, лишние пробелы и пунктуация игнорируется)? - PullRequest
1 голос
/ 30 сентября 2010

Я пишу программу на C #, которая сравнивает строки аналогично тому, как Google ищет документы по ключевым словам.

Я хочу, чтобы при поиске «переполнение стека» возвращалось значение true для «переполнение стека» (обычный), "Это переполнение стека."(в середине), «Добро пожаловать в переполнение стека».(без учета регистра), «Мне нравится переполнение стека».(переменная пробела) и «Кто ставит черту в переполнении стека?», но не «стек переполнения» (без пробелов).

Я думал, что могу использовать регулярное выражениекак и «стек ([-] |.) + переполнение», кажется чрезмерным необходимость заменять каждый пробел в каждом ключевом слове набором символов для каждого нового ключевого слова.Поскольку «переполнение стека» - не единственная строка, которую я ищу, я должен сделать это прагматично.

Ответы [ 3 ]

1 голос
/ 30 сентября 2010

Чтобы соответствовать вашим требованиям, вы можете сначала сделать

newSearchString = Regex.Replace(Regex.Escape(searchString), @"\s+", @"[\s\p{P}]+");

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

Но, конечно, это не будет соответствовать малейшей опечатке, тогда как алгоритм, использующий расстояние Левенштейна, также будет соответствовать "Stak Overfloor".

1 голос
/ 30 сентября 2010

Если вы просто хотите добиться эффекта в указанном вами конкретном случае, вы можете использовать регулярные выражения для замены токенов, которые вы хотите игнорировать, на один пробел (или пустую строку).

Если вы хотитеболее сложное решение, вы можете использовать динамическое программирование, чтобы получить наименьшую перестановку, необходимую для преобразования первой строки во вторую.Это также позволит сопоставить с (несколькими) пропущенными буквами или опечатками.

0 голосов
/ 30 сентября 2010

Если вы сравниваете с короткими строками, то самый простой способ, который я вижу, - это убрать все пробелы и другие символы из обеих строк и выполнить простое string.Contains.

...