2010-06-15 5 views
0

Je suis à la recherche d'une bibliothèque qui pourrait effectuer une correspondance de motif "facile", un type de motif qui peut être exposé via une interface graphique aux utilisateurs.Bibliothèque regex orientée utilisateur pour Java

Il devrait définir une simple syntaxe de correspondance comme * correspond à tout char et semblables. En d'autres termes, je veux faire glob (globbing) comme la logique implémentée du soleil http://openjdk.java.net/projects/nio/javadoc/java/nio/file/PathMatcher.html mais sans relation avec le système de fichiers.

Des idées?

Répondre

0

La correspondance de modèle qui étend la relation "contient" est toujours trop difficile pour les utilisateurs. Quelque chose que les utilisateurs pourraient comprendre est l'utilisation simple de "*" pour les données arbitraires et "?" pour exactement un caractère arbitraire.

C'est comme le SQL "like", et j'aimerais vraiment exposer "like" aux utilisateurs, ce qu'ils aimeraient aussi.

0

Pour globs simples qui utilisent seulement * et? en tant que caractères spéciaux, il devrait être facile de les traduire en un motif regex, sans tirer sur une toute nouvelle bibliothèque. Le code suivant est non testé mais j'utilisé quelque chose de très similaire à traduire sql « comme » les expressions à regexes:

public static boolean globMatches(String glob, String target) { 
    Pattern p = Pattern.compile("(\\*+)|(\\?)|([^*?]+)"); 
    Matcher m = p.matcher(glob); 
    StringBuilder sb = new StringBuilder(); 
    while (m.find()) { 
     String star = m.group(1); 
     String question = m.group(2); 
     String text = m.group(3); 
     if (star != null) { 
      sb.append(".*"); 
     } 
     else if (question != null) { 
      sb.append("."); 
     } 
     else { 
      sb.append(Pattern.quote(text)); 
     } 
    } 

    return target.matches(sb.toString()); 
} 
+0

Une solution astucieuse, mais ce qui se passe utilisateur tente de rechercher le littéral \ *? Nous devons également ajouter un soutien pour cela. Plus cas d'angle ... Je pense que pour des tâches comme celles-ci, une bibliothèque est une meilleure solution. –