2009-01-31 3 views
3

Интересно, есть ли простой способ проверить, соответствуют ли две строки, исключив определенные символы в строки. См. Пример ниже.Сравните две строки, игнорируя некоторые символы

Я могу легко написать такой метод, написав регулярное выражение, чтобы найти символы «wild card» и заменить их общим символом. Затем сравните две строки str1 и str2. Я не ищу таких реализаций, но хотел бы знать, есть ли какие-либо каркасные классы .Net, которые могут позаботиться об этом. Похоже на общую потребность, но я не мог найти такого метода.

Например:

string str1 = "ABC-EFG";  
string str2 = "ABC*EFG"; 

две строки должны быть объявлены равными.

Спасибо!

+1

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

+0

Сравнивать строки, в которых разделители между различными компонентами в строке не совпадают. Примеры: адреса IP/Mac, пути (хотя есть решения для этого) и другие общие случаи, когда люди имеют свой личный выбор при разделении компонентов с такими символами, как «^» или «|» и т. Д. – Mystic

+0

Правильная вещь в этом случай состоит в том, чтобы вырезать несущественные символы, как вы уже сказали. –

ответ

1

Извините, но я думаю, что любое регулярное выражение или замена символов «подстановочные знаки» общим символом будет вашим лучшим решением. В основном, ответы, которые вы заявили, вы не хотели получать.

0

Нет, в самой структуре нет ничего, что могло бы это сделать.

1

Вы, конечно, можете проверить регулярное выражение ж/подмена:

[a-zA-z]{3}.[a-zA-z]{3} 

Походит общее пользование для регулярных выражений, так почему избегания?

4

Не уверен, если это поможет:

The Damerau-Levenshtein distance является одним из нескольких алгоритмов, связанных с fuzzy string searching.

DLD между «ABC-EFG» и «ABC * EFG» - это «минимальное количество операций, необходимых для преобразования одной строки в другую, где операция определяется как вставка, удаление или замещение один символ или перенос двух символов ».

Конечно, этот алгоритм также вернет 1 для двух строк «ZBC-EFG» и «ABC-EFG» - возможно, это не то, что вы ищете.

Реализация на DLD, в Python, из http://paxe.googlecode.com/svn/trunk/paxe/Lib/Installer.py:

def dist(s1, s2): 
    d = {} 
    lenstr1 = len(s1) 
    lenstr2 = len(s2) 
    for i in xrange(-1,lenstr1+1): 
     d[(i,-1)] = i+1 
    for j in xrange(-1,lenstr2+1): 
     d[(-1,j)] = j+1 

    for i in xrange(0,lenstr1): 
     for j in xrange(0,lenstr2): 
      if s1[i] == s2[j]: 
       cost = 0 
      else: 
       cost = 1 
      d[(i,j)] = min(
       d[(i-1,j)] + 1, # deletion 
       d[(i,j-1)] + 1, # insertion 
       d[(i-1,j-1)] + cost, # substitution 
       ) 
      if i>1 and j>1 and s1[i]==s2[j-1] and s1[i-1] == s2[j]: 
       d[(i,j)] = min (d[(i,j)], d[i-2,j-2] + cost) # transposition 

    return d[lenstr1-1,lenstr2-1] 
8

я обнаружил, что с теми же требованиями, решение я был на основе метода string.Compare:

String.Compare(str1, str2, CultureInfo.InvariantCulture, CompareOptions.IgnoreSymbols) 
Смежные вопросы