2010-10-18 10 views
0

Est-il préférable d'utiliser regex ou Stringtokenizer pour séparer l'auteur et le titre dans cette chaîne:Mieux vaut utiliser regex ou StringTokenizer pour trouver l'auteur et le titre du livre dans ce: William Faulkner - « Light In Août »

William Faulkner - 'Light In August' 

Est-ce le plus simple regex qui fonctionnerait?

Pattern pattern = Pattern.compile("^\\s*([^-]+)-.*$"); 
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'"); 
String author = matcher.group(1).trim(); 
String bookTitle = matcher.group(2).trim(); 

Est-ce matraquage ou est-il un moyen plus simple de le faire avec un Stringtokenizer?

Fondamentalement, je suis à la recherche de la solution la plus transparente et maintenable depuis que je n'ai pas une bonne compréhension de regex et j'ai obtenu de l'aide avec celui ci-dessus.

+2

votre regex ne fonctionnera pas. Vous avez seulement un groupe. – dogbane

Répondre

1

Cela dépend de ce à quoi ressemble l'entrée. Votre regex, par exemple, échouerait sur les noms d'auteurs contenant un trait d'union.

Peut-être quelque chose comme

Pattern.compile("^\\s*(.*?)\\s+-\\s+'(.*)'\\s*$") 

pourrait adapter un peu mieux.

1

Comment utiliser String.split?

String s = "William Faulkner - 'Light In August'"; 
String[] parts = s.split(" - ", 2); 
String author = parts[0]; 
String title = parts[1]; 

ideone

Une chose à surveiller est que les noms de certains auteurs et titres de livres contiennent des traits d'union si fractionnement seulement sur un trait d'union ne fonctionne pas toujours en général.

2

Combien de contrôle avez-vous sur l'entrée? Pouvez-vous garantir que l'auteur et le titre seront toujours séparés par " - " (un espace, un tiret et un espace)? Savez-vous avec certitude que l'auteur ne contiendra pas" - "? Etc.

Si l'entrée est assez rigide, alors vous pouvez simplement utiliser String#split(), ce qui devrait rendre très effacer ce que vous faites. Ne pas utiliser un StringTokenizer (source):

StringTokenizer est une classe héritée qui est retenu pour des raisons de compatibilité, bien que son utilisation est déconseillée dans le nouveau code. Il est recommandé que toute personne recherchant cette fonctionnalité utilise à la place la méthode split de String ou le package java.util.regex.

Mark Byers' answer montre comment utiliser split().

Cependant, si vous avez à vous soucier de plus de variations dans l'entrée (par exemple, la quantité d'espaces blancs autour du tiret peut-elle être variable ou inexistante?), L'utilisation d'une regex sera concise et concise. Le compromis est alors la lisibilité du code et la clarté de l'intention.