2017-03-17 2 views
1
  1. Mon exigence est « Nom devrait commencer avec un alphabet et devrait avoir atleast trois caractères et ne peut pas fin avec caractère spécial, mais les caractères spéciaux peuvent venir dans le milieu. " Il ne devrait pas permettre le trait de soulignement à la fin aussi.
  2. Regex que j'utilise [a-zA-Z][\w]{1,}.*[\w]
  3. L'expression régulière ci-dessus ne reconnaît pas le trait de soulignement (_) en tant que caractère spécial à la fin.
  4. lorsque je tape "sss_" il ne reconnaît pas.
  5. lorsque je tape "sss @" ou "sss #" ou "sss $" sa reconnaissance.Expression régulière pour ne pas laisser les caractères spéciaux à la fin, y compris underscore et avec seulement 3 caractères maximum

  6. Le résultat attendu "test", "test @ test", "test_test", "tes"

  7. résultat inattendu "tes @", "test_", "te"

+0

'\ W' correspond à un' _'. Remplacer par '[^ \ W_]' à "exclure" (ou comme il est appelé, "soustraire") le '_' de' \ w'. Notez que '. *' Correspond à tous les caractères 0+ (autres que les sauts de ligne). –

+0

Que peut-il y avoir à l'intérieur? Juste des lettres? ASCII ou Unicode aussi? Quel tag est valide: JS ou PCRE ???? –

+0

ouais son travail mais si je donne, par exemple, comme a_a, team_testing, son ne fonctionne pas. il devrait permettre le trait de soulignement dans ces cas. –

Répondre

1

Mise à jour 2:

Puisque vous dites maintenant qu'il est dans Android, enlevez (?U). Toutes les classes de caractères sténographiques sont déjà compatibles Unicode dans le regex Android:

"\\p{L}+(?:[\\W_]\\p{L}+)*" 

et l'utiliser avec matches().

réponse Mise à jour

Utilisez

Boolean isValid = groupNameString.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*"); 

Voir la online Java demo.

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     System.out.println(validateName("Dąb_rośnie$gdzieś#tu")); 
     System.out.println(validateName("Some_string_here")); 
    } 
    private static boolean validateName(String name) { 
     if (name.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*")) { 
      return true; 
     } 
     return false; 
    } 
} 

Notez que vous n'avez même pas besoin de points d'ancrage lors de l'utilisation String#matches() car cette méthode ancre le modèle par défaut.

Le [\\W_] correspond à n'importe quel caractère spécial incluant a _.

réponse originale

Pour correspondre à la letters + (_ + letters) * modèle, vous pouvez utiliser

^[^\W\d_]+(?:_[^\W\d_]+)*$ 

Au lieu de [^\W\d_], vous pouvez utiliser [a-zA-Z] en JS ou tout autre moteur qui ne Unicode-conscient et vous devez gérer les lettres ASCII seulement.

L'équivalent Unicode-aware:

^\p{L}+(?:_\p{L}+)*$ 

Ici, \p{L} une lettre Unicode correspondances.

Détails:

  • ^ - début de l'ancre de chaîne
  • [^\W\d_]+/\p{L}+ - 1 ou plusieurs lettres
  • (?:_[^\W\d_]+)* - zéro ou plusieurs occurrences:
    • _ - un _
    • [^\W\d_]+/\p{L}+ - 1 ou plusieurs lettres
  • $ - fin de l'ancre de chaîne.

Voir this regex demo.

+0

Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été [déplacée pour discuter] (http://chat.stackoverflow.com/rooms/138401/discussion-on-answer-by-wiktor-stribizew-regular-expression-for-not-allowing-spe). –

0

Essayez cette expression regex

^[A-z]+[^\`|\~|\!|\@|\#|\$|\%|\^|\&|\_|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]+$