2009-01-31 12 views
3

Je me demande s'il existe un moyen facile de vérifier si deux chaînes correspondent en excluant certains caractères dans les chaînes. Voir l'exemple ci-dessous.Comparer deux chaînes en ignorant certains caractères

Je peux facilement écrire une telle méthode en écrivant une expression régulière pour trouver les caractères "joker", et les remplacer par un caractère commun. Puis comparez les deux chaînes str1 et str2. Je ne suis pas à la recherche de telles implémentations, mais je voudrais savoir s'il existe des classes de framework .Net qui peuvent en prendre soin. On dirait un besoin commun, mais je n'ai pas trouvé de méthode de ce genre.

Par exemple:

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

Les deux chaînes doivent être déclarées égales.

Merci!

+1

Si vous pensez à des choses comme les numéros de compte, je les désinfecte en général (supprime les tirets, les espaces, etc.) et fais circuler le numéro. Lorsqu'il est présenté à l'utilisateur, il peut être reformaté. –

+0

Pour comparer des chaînes dans lesquelles les délimiteurs entre différents composants de la chaîne ne sont pas identiques. Exemples: adresses IP/Mac, chemins (bien qu'il existe des solutions) et autres cas généraux où les gens ont leur choix personnel en séparant des composants avec des caractères tels que "^" ou "|", etc – Mystic

+0

La bonne chose à faire Il s'agit de supprimer des caractères non significatifs, comme vous l'avez déjà suggéré. –

Répondre

1

Désolé, mais je pense que regex, ou le remplacement des caractères "génériques" avec un caractère commun vont être votre meilleure solution. Fondamentalement, les réponses que vous avez déclaré ne vous ont pas plu.

0

Non, il n'y a rien dans le cadre lui-même qui peut le faire.

1

Vous pouvez bien sûr tester la regex w/out substitution:

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

On dirait une utilisation courante pour regex, alors pourquoi éviter?

4

Je ne sais pas si cela aide:

The Damerau-Levenshtein distance est l'un de plusieurs algorithmes traitant fuzzy string searching. Le DLD entre "ABC-EFG" et "ABC * EFG" est 1- "le nombre minimum d'opérations nécessaires pour transformer une chaîne en une autre, où une opération est définie comme une insertion, une suppression ou une substitution de un seul caractère, ou une transposition de deux caractères. "

Bien sûr, cet algorithme retournera également 1 pour les deux chaînes "ZBC-EFG" et "ABC-EFG", ce qui n'est certainement pas ce que vous cherchez.

Une mise en œuvre du DLD, en Python, de 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

je me suis retrouvé avec les mêmes exigences, la solution que j'utilisée était basée sur la méthode String.Compare:

String.Compare(str1, str2, CultureInfo.InvariantCulture, CompareOptions.IgnoreSymbols) 
Questions connexes