2011-10-13 5 views
2

Je suis un utilisateur Java mais je suis nouveau pour les expressions régulières. Je veux juste avoir une expression minuscule qui, étant donné un mot (nous supposons que la chaîne est un seul mot), répond par un booléen, indiquant si le mot est valide ou non.Expression régulière correspondant à "mots du dictionnaire"

Un exemple ... Je veux attraper tous les mots qui sont plausibles pour être dans un dictionnaire ... Donc, je veux juste des mots avec des caractères de AZ AZ, un trait d'union (par exemple: man-in-the - milieu) et une apostrophe (comme je vais ou Tiffany).

mots valides:

  • "food"
  • "RocKet"
  • "man-in-the-middle"
  • "kahsdkjhsakdhakjsd"
  • "JESUS", etc.

mots non valides :

J'utilise ce code, mais il ne sera pas donné la bonne réponse:

Pattern p = Pattern.compile("[A-Za-z&-&']"); 
Matcher m = p.matcher(s); 
System.out.println(m.matches()); 

Quel est le problème avec mon regex?

+1

est-il pas un peu naïf (peut-être même blasé) de supposer que les mots contiennent uniquement des lettres ASCII? –

+1

dépend de la langue (Celui qu'il speeks, pas de codes) :) Et je pense, aussi longtemps que vous codez juste pour le plaisir, il n'y a pas de problème. – Sibbo

+0

Area-51? Deadmau5? – fredley

Répondre

4
  • Ajouter un + après l'expression pour dire « un ou plusieurs de ces caractères »:
  • Échapper le trait d'union avec \ (ou le mettre dernier).
  • Retirez ces & caractères:

Voici le code:

Pattern p = Pattern.compile("[A-Za-z'-]+"); 
Matcher m = p.matcher(s); 
System.out.println(m.matches()); 

Test complet: (. Produit pas de sortie)

String[] ok = {"food","RocKet","man-in-the-middle","kahsdkjhsakdhakjsd","JESUS"}; 
String[] notOk = {"gipsy76", "www.google.com", "[email protected]", "745474","+-x/" }; 

Pattern p = Pattern.compile("[A-Za-z'-]+"); 

for (String shouldMatch : ok) 
    if (!p.matcher(shouldMatch).matches()) 
     System.out.println("Error on: " + shouldMatch); 

for (String shouldNotMatch : notOk) 
    if (p.matcher(shouldNotMatch).matches()) 
     System.out.println("Error on: " + shouldNotMatch); 

+0

Pourquoi utilisez-vous le 'à la fin de votre regex? – Sibbo

+0

Il devrait correspondre par exemple '' Tiffany ''' – aioobe

+0

oh, le dépasser – Sibbo

1

Cela devrait fonctionner:

"[A-Za-z'-]+"

+0

Notez qu'avec un '*' il correspond à la chaîne vide, '" "' qui n'est vraisemblablement pas un mot qui peut apparaître dans un dictionnaire;) – aioobe

+0

maintenant il le fait ;-) – Sibbo

+0

Merci pour le guick et (comme toujours) correct répondre :) – nunoaac

-1

Salut Aloob s'il vous plaît vérifier ce, peu long, peut-être avoir la version plus courte de ce fait, encore ...

[A-z]*||[[A-z]*[-]*]*||[[A-z]*[-]*[']*]* 
+0

pourquoi avez-vous fait cela? – Sibbo

+0

Pouvez-vous expliquer ce que vous entendez par là (ce n'est évidemment pas une expression régulière valide/qui fonctionne)? Qu'y a-t-il avec les doubles barres obliques, les doubles tuyaux, les supports imbriqués, etc.? Que pensez-vous que [A-z] 'fait? –

+0

@TimPietzcker Ok les gars, j'essayais juste de l'obtenir, je m'excuse pour cette réponse. Ca a marché pour moi, c'est pourquoi je l'ai juste collé. [A-z] signifie qu'il va comparer les deux lettres de cas. DOuble pipes signifie «Ou». Désolé ... – Jithu

0

Mais "mot" et "mot" ne sont pas valides. Ainsi, vous pouvez utilise ce modèle:

WORD_EXP = "^[A-Za-z]+(-[A-Za-z]+)*$" 
0

Regex -/^ (? [A-zA-Z] * ('| -) [a-zA-Z] +) */

Vous pouvez utiliser ci-dessus regex si vous ne voulez pas successifs "'" ou "-". Il vous donnera précise correspondant à votre texte. Il accepte man-in-the-middle asd'asdasd'asd

Il rejette chaîne suivante homme - en - midle asdasd''asd

Questions connexes