- 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.
- Regex que j'utilise
[a-zA-Z][\w]{1,}.*[\w]
- L'expression régulière ci-dessus ne reconnaît pas le trait de soulignement
(_)
en tant que caractère spécial à la fin. - lorsque je tape "sss_" il ne reconnaît pas.
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
Le résultat attendu "test", "test @ test", "test_test", "tes"
résultat inattendu "tes @", "test_", "te"
Répondre
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.
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). –
Essayez cette expression regex
^[A-z]+[^\`|\~|\!|\@|\#|\$|\%|\^|\&|\_|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]+$
'\ 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). –
Que peut-il y avoir à l'intérieur? Juste des lettres? ASCII ou Unicode aussi? Quel tag est valide: JS ou PCRE ???? –
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. –