RegEx pour Javascript pour autoriser uniquement les caractères alphanumériques

237

J'ai besoin de trouver un reg ex qui n'autorise que l'alphanumérique. Jusqu'à présent, tout le monde que j'essaie ne fonctionne que si la chaîne est alphanumérique, ce qui signifie qu'il contient à la fois une lettre et un chiffre. Je veux juste un qui permettrait soit l'un ni l'autre.

Utilisateur
la source

Réponses:

512
/^[a-z0-9]+$/i

^         Start of string
[a-z0-9]  a or b or c or ... z or 0 or 1 or ... 9
+         one or more times (change to * to allow empty string)
$         end of string    
/i        case-insensitive

Mise à jour (prise en charge des caractères universels)

si vous avez besoin que cette expression rationnelle prenne en charge le caractère universel, vous pouvez trouver la liste des caractères unicode ici.

par exemple: /^([a-zA-Z0-9\u0600-\u06FF\u0660-\u0669\u06F0-\u06F9 _.-]+)$/

cela soutiendra le persan.

Greg
la source
50
[az] ne correspond pas aux caractères internationaux.
Eric Normand
23
Wow - Je ne pense pas avoir jamais complètement compris l'expression régulière jusqu'à ce qu'elle soit décomposée de cette manière simple. Merci!
Matt Cashatt
Problème - sans / g, vous finissez seulement par remplacer les correspondances avant un retour à la ligne.
Volomike
5
une autre manière serait [^\W_]mais [a-z0-9]/ i est une manière évidente.
Vitim.us
36
@Greg, j'apprécie la façon dont vous expliquez vos réponses liées aux expressions régulières. Les expressions rationnelles sans explications, à mon avis, sont en quelque sorte inutiles. Parce que vous obtenez qu'un temps « ouais ça marche » et tout à coup, quand vous avez besoin de le changer , vous revenez à droite avec un autre cas d' utilisation, au lieu d'apprendre réellement ce que le regex fait . De plus, vous êtes plus facile à comprendre que la documentation regex: P
Chris Cirefice
147

Si vous vouliez retourner un résultat remplacé, alors cela fonctionnerait:

var a = 'Test123*** TEST';
var b = a.replace(/[^a-z0-9]/gi,'');
console.log(b);

Cela reviendrait:

Test123TEST

Notez que le gi est nécessaire car il signifie global (pas seulement sur la première correspondance) et insensible à la casse, c'est pourquoi j'ai az au lieu de a-zA-Z. Et le ^ à l'intérieur des crochets signifie "tout ce qui n'est pas entre ces crochets".

AVERTISSEMENT: l'alphanumérique est idéal si c'est exactement ce que vous voulez. Mais si vous l'utilisez sur un marché international comme le nom d'une personne ou sa zone géographique, vous devez tenir compte des caractères unicode, ce qui ne fonctionnera pas. Par exemple, si vous avez un nom comme "Âlvarö", cela le rendrait "lvar".

Volomike
la source
3
C'est une excellente réponse avec l'explication. N'oubliez pas de prévoir des espaces si vous en avez besoin. .replace (/ [^ a-z0-9 \] / gi, '')
Joe Johnston
82

Utilisez le mot classe de caractères. Ce qui suit équivaut à un ^[a-zA-Z0-9_]+$:

^\w+$

Explication:

  • ^ début de chaîne
  • \ w n'importe quel caractère de mot (AZ, az, 0-9, _).
  • $ fin de chaîne

À utiliser /[^\w]|_/gsi vous ne souhaitez pas faire correspondre le trait de soulignement.

Chase Seibert
la source
21
\ w est en fait équivalent à [a-zA-Z_0-9] donc votre RegEx correspond également aux traits de soulignement [_].
Martin Brown
presque alphanumérique n'est pas du tout alphanumérique, mais merci vos ans m'ont beaucoup aidé
ajax333221
Certes, pas une réponse stricte au Q tel que publié, mais exactement ce que je cherchais ..
prototype
Désolé, mais cela ne correspond pas aux caractères internationaux, tels que Ä
Alex Mi
dommage que cela supprime mes accents
Miguel
38
/^([a-zA-Z0-9 _-]+)$/

l'expression rationnelle ci-dessus autorise les espaces dans une chaîne et restreint les caractères spéciaux. Elle autorise uniquement az, AZ, 0-9, espace, soulignement et tiret.

Gayan Dissanayake
la source
14
^\s*([0-9a-zA-Z]*)\s*$

ou, si vous voulez au moins un caractère:

^\s*([0-9a-zA-Z]+)\s*$

Les crochets indiquent un ensemble de caractères. ^ est le début de l'entrée. $ est la fin de la saisie (ou la nouvelle ligne, selon vos options). \ s est un espace.

L'espace avant et après est facultatif.

Les parenthèses sont l'opérateur de regroupement pour vous permettre d'extraire les informations souhaitées.

EDIT: supprimé mon utilisation erronée du jeu de caractères \ w.

cletus
la source
6

Au lieu de rechercher une chaîne alphanumérique valide, vous pouvez y parvenir indirectement en vérifiant la chaîne pour tout caractère non valide. Pour ce faire, vérifiez tout ce qui correspond au complément de la chaîne alphanumérique valide.

/[^a-z\d]/i    

Voici un exemple:

var alphanumeric = "someStringHere";
var myRegEx  = /[^a-z\d]/i;
var isValid = !(myRegEx.test(alphanumeric));

Remarquez l'opérateur non logique isValid, car je teste si la chaîne est fausse, pas si elle est valide.

Schalk
la source
6

Cela fonctionnera

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$

Il accepte uniquement les caractères alphanumériques:
cas de test passés:

dGgs1s23 - valid
12fUgdf  - valid,
121232   - invalid, 
abchfe   - invalid,
 abd()*  - invalid, 
42232^5$ - invalid

ou

Vous pouvez également essayer celui-ci. cette expression satisfait au moins un chiffre et un caractère et aucun autre caractère spécial

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$

en angulaire peut tester comme:

$scope.str = '12fUgdf';
var pattern = new RegExp('^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$');
$scope.testResult = pattern.test($scope.str);

PLUNKER DEMO

Référé: Expression régulière pour alphanumérique dans Angularjs

Crâne
la source
4

Étendez le prototype de chaîne à utiliser tout au long de votre projet

    String.prototype.alphaNumeric = function() {
        return this.replace(/[^a-z0-9]/gi,'');
    }

Usage:

    "I don't know what to say?".alphaNumeric();
    //Idontknowwhattosay
Nicolas Giszpenc
la source
3

Saisissez ce code sur votre SCRATCHPAD et voyez l'action.

var str=String("Blah-Blah1_2,oo0.01&zz%kick").replace(/[^\w-]/ig, '');
Abbas
la source
2

Il semble que de nombreux utilisateurs ont remarqué que ces expressions régulières échoueront presque certainement à moins que nous ne travaillions strictement qu'en anglais. Mais je pense qu'il existe un moyen simple de progresser qui ne serait pas aussi limité.

  1. faire une copie de votre chaîne en MAJUSCULE
  2. faire une deuxième copie en minuscules

Les caractères qui correspondent dans ces chaînes ne sont certainement pas de nature alphabétique.

let copy1 = originalString.toUpperCase();
let copy2 = originalString.toLowerCase();
for(let i=0; i<originalString.length; i++) {
    let bIsAlphabetic = (copy1[i] != copy2[i]);
}

En option, vous pouvez également détecter des chiffres en recherchant simplement les chiffres de 0 à 9.

John Dorsey
la source
2

Essayez ceci ... Remplacez votre ID de champ par #nom ... az (a à z), AZ (A à Z), 0-9 (0 à 9)

jQuery(document).ready(function($){
    $('#name').keypress(function (e) {
        var regex = new RegExp("^[a-zA-Z0-9\s]+$");
        var str = String.fromCharCode(!e.charCode ? e.which : e.charCode);
        if (regex.test(str)) {
            return true;
        }
        e.preventDefault();
        return false;
    });
});
Tanmay Patel
la source
2

JAVASCRIPT n'acceptera que les CHIFFRES, ALPHABETS et PERSONNAGES SPÉCIAUX

document.getElementById("onlynumbers").onkeypress = function (e) {
	onlyNumbers(e.key, e)
};

document.getElementById("onlyalpha").onkeypress = function (e) {
	onlyAlpha(e.key, e)
};

document.getElementById("speclchar").onkeypress = function (e) {
	speclChar(e.key, e)
};

function onlyNumbers(key, e) {
	var letters = /^[0-9]/g; //g means global
	if (!(key).match(letters)) e.preventDefault();
}

function onlyAlpha(key, e) {
	var letters = /^[a-z]/gi; //i means ignorecase
	if (!(key).match(letters)) e.preventDefault();
}

function speclChar(key, e) {
	var letters = /^[0-9a-z]/gi;
	if ((key).match(letters)) e.preventDefault();
}
<html>
   <head></head>
   <body>
      Enter Only Numbers: 
      <input id="onlynumbers" type="text">
      <br><br>
      Enter Only Alphabets: 
      <input id="onlyalpha" type="text" >
      <br><br>
      Enter other than Alphabets and numbers like special characters: 
      <input id="speclchar" type="text" >
   </body>
</html>

Pranav Bhat
la source
1

Encore mieux que Gayan Dissanayakesouligné.

/^[-\w\s]+$/

^[a-zA-Z0-9]+$Peut maintenant être représenté comme^\w+$

Vous voudrez peut-être utiliser \ s au lieu de l'espace. Notez que \ s s'occupe des espaces et pas seulement d'un caractère d'espace.

Brian
la source
1

J'ai une chaîne similaire à Samsung Galaxy A10s 6,2 pouces (2 Go, 32 Go ROM) Android 9.0, (13MP + 2MP) + 8MP Dual SIM 4000mAh 4G LTE Smartphone - Noir (BF19)

Voici ce que j'ai fait:

string.replace(/[^a-zA-Z0-9 ,._-]/g, '').split(',').join('-').split(' ').join('-').toLowerCase()

Remarquez que j'autorisais ,._-alors à utiliser split()et join()à remplacer respectivement ,par -et à -.

J'ai fini par obtenir quelque chose comme ça: samsung-galaxy-a10s-6.2-inch-2gb-32gb-rom-android-9.0-13mp-2mp-8mp-dual-sim-4000mah-4g-lte-smartphone-black-bf19-20c'est ce que je voulais.

Il pourrait y avoir une meilleure solution, mais c'est ce que j'ai trouvé qui fonctionnait bien pour moi.

Harrison O
la source
0

Enregistrez cette constante

const letters = /^[a-zA-Z0-9]+$/

maintenant, pour vérifier la pièce, utilisez .match ()

const string = 'Hey there...' // get string from a keyup listner
let id = ''
// iterate through each letters
for (var i = 0; i < string.length; i++) {
  if (string[i].match(letters) ) {
    id += string[i]
  } else {
    // In case you want to replace with something else
    id += '-'  
  }
}
return id
Abhin Krishna KA
la source
-1

Jquery accepte uniquement les CHIFFRES, ALPHABETS et PERSONNAGES SPÉCIAUX

<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
Enter Only Numbers: 
<input type="text" id="onlynumbers">
<br><br>
Enter Only Alphabets: 
<input type="text" id="onlyalpha">
<br><br>
Enter other than Alphabets and numbers like special characters: 
<input type="text" id="speclchar">

<script>
    $('#onlynumbers').keypress(function(e) {
      var letters=/^[0-9]/g; //g means global
      if(!(e.key).match(letters)) e.preventDefault();
	});
    
    $('#onlyalpha').keypress(function(e) {
      var letters=/^[a-z]/gi; //i means ignorecase
      if(!(e.key).match(letters)) e.preventDefault();
	});
    
    $('#speclchar').keypress(function(e) {
      var letters=/^[0-9a-z]/gi; 
      if((e.key).match(letters)) e.preventDefault();
	});
    </script>
</body>
</html>

**JQUERY to accept only NUMBERS , ALPHABETS and SPECIAL CHARACTERS **


<!DOCTYPE html>
    $('#onlynumbers').keypress(function(e) {
      var letters=/^[0-9]/g; //g means global
      if(!(e.key).match(letters)) e.preventDefault();
    });

    $('#onlyalpha').keypress(function(e) {
      var letters=/^[a-z]/gi; //i means ignorecase
      if(!(e.key).match(letters)) e.preventDefault();
    });

    $('#speclchar').keypress(function(e) {
      var letters=/^[0-9a-z]/gi; 
      if((e.key).match(letters)) e.preventDefault();
    });
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"> 

Entrer uniquement des chiffres:

Entrer uniquement des alphabets:

Entrer autre que des alphabets et des chiffres comme des caractères spéciaux:

</body>
</html>
Pranav Bhat
la source
1
jquery n'est pas javascript
rsm
Ouais. Merci le code ci-dessus fonctionne, vous pouvez vérifier en cliquant sur exécuter l'extrait de code.
Pranav Bhat
jquery est une bibliothèque javascript
Pranav Bhat
nous pouvons utiliser jquery au lieu de javascript, ce sera facile :)
Pranav Bhat
Je suis désolé tu avais raison .. J'en ai posté un autre avec javascript! Merci beaucoup!
Pranav Bhat