Je voulais convertir des ensembles de chaînes en expression régulière en utilisant java.
J'ai cherché beaucoup de choses mais il n'y avait pas de réponse aussi satisfaisante disponible sur Internet qui résout mon problème. donc je préfère demander ici.
D'abord est-il possible de le convertir si oui, alors veuillez me suggérer le moyen de se débarrasser de ce problème auquel je suis confronté?
Supposons J'ai des ensembles de chaînes
(a+b)*abb
et je veux créer une expression régulière pour cela comme
abb abababb babb aabb bbbbabb ...
comment il peut être possible?
4 Réponses :
Vous pouvez utiliser la méthode Pattern.compile décrite ici .
Cette réponse est fausse. Pattern, en collaboration avec Matcher, est pour quelque chose de complètement différent. Pattern compilera une expression régulière, tant qu'elle est valide, sinon PatternSyntaxException est levée. Ensuite, vous pouvez créer des Matchers pour un Pattern donné. Avec le Matcher, vous pouvez faire des choses comme compter le nombre d'occurrences pour le Pattern donné. A moins que vous ne fournissiez une expression rationnelle comme "aaa | bbb | ccc | ..." pour toutes les chaînes dont il parle, ce qui pour moi est totalement fou.
Correct, cette réponse n'est plus pertinente une fois la question mise à jour.
Ok alors j'écrivais pendant que l'éditeur éditait: D
Ce que vous recherchez, c'est un moyen de déduire une expression régulière à partir d'un ensemble d'exemples. Il s'agit d'un problème informatique non trivial à résoudre pour le cas général. Voir ce message pour plus de détails.
Je ne pense pas que vous le puissiez.
Le problème est que vous ne souhaitez fournir qu'une partie de la collection totale de chaînes valides et que l'algorithme n'a aucun moyen de déduire l'ensemble complet exact du sous-ensemble donné. Si vous fournissez l'ensemble complet de chaînes valides (et il ne semble pas que vous le puissiez), vous pouvez utiliser la réponse de David Zimmerman dans les commentaires. Ou, peut-être plus efficacement, utilisez simplement un ensemble pour contenir l'ensemble complet de chaînes valides et pour tester les chaînes candidates.
Si vous avez une collection de chaînes et que vous souhaitez créer une expression régulière qui correspond à l'une de ces chaînes, vous devez créer une expression régulière qui utilise le modèle OR | .
Puisque les chaînes peuvent contiennent des caractères spéciaux regex, ils doivent être entre guillemets.
Pour vous assurer que la meilleure chaîne correspond, vous devez d'abord rechercher la chaîne la plus longue. Par exemple. si aba et abax sont tous les deux sur la liste et que le texte à scanner contient abax , nous voudrions faire correspondre la deuxième chaîne, pas le premier.
Donc, vous pouvez le faire comme ceci:
public static String toRegex(Iterable<String> strings) {
return StreamSupport.stream(strings.spliterator(), false)
.sorted(Comparator.comparingInt(String::length).reversed())
.map(Pattern::quote)
.collect(Collectors.joining("|"));
}
Que gagneriez-vous à convertir une chaîne en "expression régulière"? une expression régulière est une règle qui ne peut pas être définie par une chaîne donnée, sauf si vous prévoyez d'avoir une expression régulière qui accepte cette chaîne seule
Supposons que j'aie des ensembles de chaînes {abb, abababb, babb, aabb, bbbbabb ...} et que je veuille créer une expression régulière pour cela comme "(a + b) * abb" comment cela peut-il être possible?
Que diriez-vous de abb | abababb | babb | aabb | bbbbabb
Je voulais seulement convertir l'ensemble spécifique de chaînes en expression régulière, je ne recherche aucun générateur automatique dans lequel nous mettons des chaînes et nous obtenons l'expression régulière, je me concentre sur l'expression régulière mentionnée ci-dessus.
Je ne comprends pas la question. Créez simplement une expression régulière, comme vous l'écrivez dans votre question? Êtes-vous à la recherche d'un moyen automatisé de créer une telle expression régulière?
À ce stade, il s'agit davantage d'un problème de génie logiciel. Vous pouvez créer un automate qui accepte ce langage, puis le minimiser à l'aide d'algorithmes de minimisation réguliers. Lisez Langage standard et Théorie des automates si vous voulez suivre une telle voie.