7
votes

Y a-t-il une telle chose comme un caractère générique en Java?

Je gère un programme de comparaison et à la minute où il fait une comparaison directe «string-to-string» et s'il s'agit d'une correspondance exacte, elle génère qu'il s'agit d'une correspondance.

Eh bien, j'espérais Ajoutez une fonctionnalité supplémentaire qui a permis de «similarité» ...

Donc, par exemple: xxx

Ceci est sorti d'un extrait de code du code. J'aimerais que cela sonne sur le "00" et la reconnaît toujours comme "presque" le même numéro et le génère toujours.

J'imagine que cela ressemblerait à quelque chose comme em2 = "524" + ## + "646" mais c'est évidemment juste un concept

Est-ce que quelqu'un sait s'il y a un moyen d'avoir ce genre de "Wildcard" (un terme que je ' VE ramassé de Uni SQL) ou s'il y a une autre façon de faire cette affaire de type de similarité.

Merci :)


0 commentaires

9 Réponses :


8
votes

Vous pouvez le résoudre facilement en utilisant des expressions régulières: xxx pré>

par exemple. p>

(le . code> est une faute de caractères qui représente n'importe quel caractère . Vous pouvez le remplacer par \\ d code> si vous souhaitez limiter le caractère générique à chiffres.) p>

Voici une variante plus générale qui correspond à "0" contre n'importe quel caractère: p>

String em1 = "52494646";
String em2 = "52400646";

if (em1.matches(em2.replaceAll("0", "\\\\d"))){
    System.out.println("Matches");
}


0 commentaires

19
votes

Vous pouvez utiliser des expressions régulières: xxx

pour la documentation spécifique Java Voir Le modèle Classe . Pour certaines utilisations d'expressions régulières (telles que dans l'échantillon ci-dessus), il existe des méthodes de raccourci dans string : correspond () , < Un href = "https://docs.oracle.com/fr/java/javase/11/docs/api/java.base/java/lang/string.html#replaceall(java.lang.string,java.lang. String) "rel =" nOfollow NOREFERRER "> remplaille () / remplafirst () et divisé () .

régulier-expressions.info a une bonne documentation sur l'expression régulière en général.


4 commentaires

Cela pourrait-il être fait avec des lettres aussi, comme dans les personnages hexagonaux A-F?


Oui, Expressions régulières peut faire cela et beaucoup plus (voir régulier-expressions.info pour des informations vraiment belles sur regex).


Et vraisemblablement, j'ai besoin de télécharger cette chose de regex? Ou vient-il avec le kit de développement Java standard?


@user: Les expressions régulières font partie de Java depuis 1,4 (et ont été disponibles en tant que bibliothèques de tiers avant cela). Voir le modèle Classe .



2
votes

Généralement, vous pouvez utiliser une combinaison de startswith, de bout en bout ou contient pour trouver si une chaîne commence avec, se termine avec ou contient une autre chaîne. Vous pouvez les utiliser en combinaison, tels que

number.startsWith("524") && number.endsWith("646");


0 commentaires

1
votes

Les expressions régulières seraient comme si vous voulez faire cela. Pour votre exemple, vous voudriez quelque chose comme "524 \\ d {2} 646" . Voir le API Java pour Regex .

Voir aussi la bibliothèque d'Apache Apache Apache IO ici car il ressemble à vous de traiter avec des fichiers: https://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org /APache/commons/io/package-summary.html


0 commentaires

0
votes

Vous devez utiliser Expressions régulières pour cela.


0 commentaires

0
votes

Eh bien, malheureusement, je crois que Apache Commons Stringutil n'a aucune opération de caractères génériques.

Si je me souviens bien, il existe une classe Stringutils sur MySQL JDBC Connector qui a une méthode permettant de comparer des chaînes avec des caractères génériques.

-or -

Vous pouvez essayer d'utiliser une logique Fuzz: http://jfuzzylogic.sourceforge.net/html/ index.html


0 commentaires

2
votes

Je pense que le problème de la solution de réponse susmentionnée est que vous n'êtes pas intéressé par des chiffres identiques, mais pour la 3ème ou la 4ème position, mais en nombre identique mais pour un / deux chiffres.

Qui est un problème un peu plus compliqué, mais vous voulez essentiellement calculer le http: //fr.wikipedia .org / wiki / hamming_distance pour vos deux cordes. Algorithme bien connu pour beaucoup de problèmes pour que vous puissiez trouver de nombreux exemples, mais je crains que la bibliothèque standard ne le fasse pas. En outre, c'est une boucle et un comptoir, vous ne devriez donc pas avoir de problèmes avec une implémentation - vous perdez un potentiel d'optimisation que la STL peut utiliser (comparer les adresses des deux chaînes et vous devez comparer la chaîne entière dans les deux cas), mais pas beaucoup plus.


0 commentaires

0
votes

Pourquoi les gens sont-ils réticents à écrire un algorithme simple et direct? XXX


1 commentaires

Peut-être parce que la construction de choses génériques est la meilleure façon d'écrire du code. En utilisant des expressions régulières, nous avons une grande capacité d'écriture, mais nous générons un (petit) manque de capacité de lecture. Mais nous devrons toujours avoir à créer plus d'une expression pour gérer différents cas. L'utilisation de la logique floue est de loin générique et peut gérer tous les cas. L'utilisation d'un algorithme direct gérera une seule situation particulière.



0
votes

Si vous recherchez une autre façon d'exprimer une faute générique, voici une option: xxx


0 commentaires