RegEx dla Javascript, aby zezwolić tylko na alfanumeryczny

237

Muszę znaleźć reg ex, który pozwala tylko na alfanumeryczny. Jak dotąd każdy, którego próbuję, działa tylko wtedy, gdy ciąg jest alfanumeryczny, co oznacza, że ​​zawiera zarówno literę, jak i cyfrę. Chcę tylko jednego, który by na to pozwolił i nie wymagał obu.

Użytkownik
źródło

Odpowiedzi:

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

Aktualizacja (obsługa uniwersalnych znaków)

jeśli potrzebujesz tego wyrażenia regularnego obsługuje znak uniwersalny, możesz tutaj znaleźć listę znaków znaków Unicode.

na przykład: /^([a-zA-Z0-9\u0600-\u06FF\u0660-\u0669\u06F0-\u06F9 _.-]+)$/

to będzie wspierać perski.

Greg
źródło
50
[az] nie pasuje do znaków międzynarodowych.
Eric Normand
23
Wow - nie sądzę, że kiedykolwiek do końca rozumiałem regex, dopóki nie został on podzielony w ten prosty sposób. Dzięki!
Matt Cashatt
Problem - bez / g zastępujesz dopasowania tylko przed zawijaniem wiersza.
Volomike,
5
innym sposobem byłoby, [^\W_]ale [a-z0-9]/ i jest oczywistym sposobem.
Vitim.us
36
@Greg, podoba mi się sposób, w jaki wyjaśniasz odpowiedzi związane z wyrażeniami regularnymi. Regeksy bez wyjaśnień, moim zdaniem, są w pewnym sensie bezużyteczne. Ponieważ dostajesz to jednorazowe „tak, to działa” i nagle, kiedy musisz to zmienić, wracasz z innym przypadkiem użycia, zamiast faktycznie uczyć się, co robi wyrażenie regularne . Ponadto łatwiej jest zrozumieć niż dokumentacja regularna: P
Chris Cirefice,
147

Jeśli chcesz zwrócić zastąpiony wynik, to zadziała:

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

To zwróci:

Test123TEST

Zauważ, że gi jest konieczne, ponieważ oznacza globalne (nie tylko przy pierwszym dopasowaniu) i nie rozróżnia wielkości liter, dlatego mam az zamiast a-zA-Z. A ^ w nawiasach oznacza „cokolwiek poza tymi nawiasami”.

OSTRZEŻENIE: Alfanumeryczny jest świetny, jeśli właśnie tego chcesz. Ale jeśli używasz tego na rynku międzynarodowym jak na nazwisko lub obszar geograficzny, musisz wziąć pod uwagę znaki Unicode, czego to nie zrobi. Na przykład, jeśli masz nazwę taką jak „Âlvarö”, byłoby to „lvar”.

Volomike
źródło
3
To świetna odpowiedź z wyjaśnieniem. Pamiętaj, aby zezwolić na spacje, jeśli ich potrzebujesz. .replace (/ [^ a-z0-9 \] / gi, '')
Joe Johnston,
82

Użyj słowa klasy znaków. Poniższe jest równoważne z ^[a-zA-Z0-9_]+$:

^\w+$

Wyjaśnienie:

  • ^ początek ciągu
  • \ w dowolny znak słowa (AZ, az, 0-9, _).
  • $ koniec łańcucha

Użyj, /[^\w]|_/gjeśli nie chcesz dopasowywać podkreślenia.

Chase Seibert
źródło
20
\ w jest faktycznie równoważne z [a-zA-Z_0-9], więc twoje RegEx również pasuje do podkreślników [_].
Martin Brown,
prawie alfanumeryczny wcale nie jest alfanumeryczny, ale dzięki twojemu ans bardzo mi pomógł
ajax333221
To prawda, nie jest to ścisła odpowiedź na opublikowane pytanie Q, ale dokładnie to, czego szukałem ...
prototyp
Przepraszamy, ale to nie pasuje do znaków międzynarodowych, takich jak Ę
Alex Mi
szkoda, że ​​usuwam moje akcenty
Miguel
38
/^([a-zA-Z0-9 _-]+)$/

powyższe wyrażenie regularne dopuszcza spacje w łańcuchu znaków i ogranicza znaki specjalne. Dopuszcza tylko az, AZ, 0-9, spację, podkreślenie i myślnik.

Gayan Dissanayake
źródło
14
^\s*([0-9a-zA-Z]*)\s*$

lub, jeśli chcesz mieć co najmniej jeden znak:

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

Nawiasy kwadratowe oznaczają zestaw znaków. ^ oznacza początek wprowadzania. $ jest końcem wprowadzania (lub znakiem nowej linii, w zależności od opcji). \ s jest spacją.

Biała spacja przed i po jest opcjonalna.

Nawiasy są operatorem grupowania, który pozwala wyodrębnić potrzebne informacje.

EDYCJA: usunąłem moje błędne użycie zestawu znaków \ ​​w.

Cletus
źródło
6

Zamiast sprawdzać prawidłowy ciąg alfanumeryczny, można to osiągnąć pośrednio, sprawdzając ciąg pod kątem niepoprawnych znaków. Zrób to, sprawdzając wszystko, co pasuje do dopełnienia prawidłowego ciągu alfanumerycznego.

/[^a-z\d]/i    

Oto przykład:

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

Zwróć uwagę na operator logiczny not at isValid, ponieważ testuję, czy łańcuch jest fałszywy, a nie czy jest poprawny.

Schalk
źródło
6

To zadziała

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

Akceptuje tylko znaki alfanumeryczne:
przypadki testowe zawieszone:

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

lub

Możesz także spróbować tego. wyrażenie to spełniało co najmniej jedną cyfrę i jeden znak oraz żadnych innych znaków specjalnych

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

w kącie może testować jak:

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

DEMO PLUNKERA

Odwołano: Wyrażenie regularne dla alfanumerycznego w Angularjs

Czaszka
źródło
4

Rozszerz prototyp łańcucha, aby mógł być używany w całym projekcie

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

Stosowanie:

    "I don't know what to say?".alphaNumeric();
    //Idontknowwhattosay
Nicolas Giszpenc
źródło
3

Wprowadź te kody do SCRATCHPAD i zobacz akcję.

var str=String("Blah-Blah1_2,oo0.01&zz%kick").replace(/[^\w-]/ig, '');
Abbas
źródło
2

Wygląda na to, że wielu użytkowników zauważyło, że te wyrażenia regularne prawie na pewno zawiodą, chyba że będziemy ściśle pracować w języku angielskim. Myślę jednak, że istnieje prosty sposób, który nie byłby tak ograniczony.

  1. zrób kopię swojego ciągu we wszystkich LITERACH
  2. zrób drugą kopię małymi literami

Wszelkie znaki pasujące do tych ciągów zdecydowanie nie mają charakteru alfabetycznego.

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

Opcjonalnie możesz także wykryć cyfry, szukając cyfr od 0 do 9.

John Dorsey
źródło
2

Spróbuj ... Zamień swój identyfikator pola na #nazwa ... az (od a do z), AZ (od A do Z), 0-9 (od 0 do 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
źródło
2

JAVASCRIPT, aby akceptować tylko NUMERY, ALFABETY i SPECJALNE CHARECTERS

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
źródło
1

Nawet lepiej niż Gayan Dissanayakezaznaczono.

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

Teraz ^[a-zA-Z0-9]+$może być reprezentowany jako^\w+$

Możesz użyć \ s zamiast spacji. Pamiętaj, że \ s zajmuje się białymi znakami, a nie tylko jedną spacją.

Brian
źródło
1

Mam ciąg podobny do Samsung Galaxy A10s 6.2-calowy (2 GB, 32 GB ROM) Android 9.0, (13MP + 2MP) + 8MP Dual SIM 4000mAh 4G LTE Smartphone - czarny (BF19)

Poniżej zrobiłem:

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

Zauważ, że pozwoliłem ,._-następnie użyć split()i join()do zamiany ,na -i spacji do- odpowiednio.

W końcu dostałem coś takiego: samsung-galaxy-a10s-6.2-inch-2gb-32gb-rom-android-9.0-13mp-2mp-8mp-dual-sim-4000mah-4g-lte-smartphone-black-bf19-20tego właśnie chciałem.

Być może jest lepsze rozwiązanie, ale dla mnie to działa dobrze.

Harrison O
źródło
0

Zapisz tę stałą

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

teraz do sprawdzania części użyj .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
źródło
-1

Jquery akceptuje tylko NUMERY, ALFABETY i SPECJALNE ŁADUNKI

<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"> 

Wprowadź tylko cyfry:

Wprowadź tylko alfabety:

Wprowadź inne niż alfabety i cyfry, takie jak znaki specjalne:

</body>
</html>
Pranav Bhat
źródło
1
jquery nie jest javascript
rsm
Tak. Dzięki powyższy kod działa, możesz to sprawdzić, klikając polecenie Uruchom fragment kodu.
Pranav Bhat
jquery to biblioteka javascript
Pranav Bhat
możemy użyć jquery zamiast javascript, to będzie łatwe :)
Pranav Bhat
Jestem Sorrry, masz rację .. Napisałem kolejny z javascript! Wielkie dzięki!
Pranav Bhat