User
User

Reputation: 3792

RegEx for Javascript to allow only alphanumeric

I need to find a reg ex that only allows alphanumeric. So far, everyone I try only works if the string is alphanumeric, meaning contains both a letter and a number. I just want one what would allow either and not require both.

Upvotes: 343

Views: 634775

Answers (23)

Stuart Schechter
Stuart Schechter

Reputation: 593

The following function filters out characters that are not alphameric unicode characters, preserving not only digits but letters from any language (including those that do not use roman a-z) such that "1 éclair s'il vous plaît!" becomes "1éclairsilvousplaît":

const keepOnlyAlphanumeric = (s: string) => s.replace(/[^\p{L}\p{Nd}]/ug,'');

As others have pointed out, regular expressions have syntax that most of us don't use everyday, and can be very hard to understand without explanations, so let's walk through this one.

The function uses the javascript string replace function with the second parameter (following the regular expression) is a null string ('') to replace those characters that are not alphanumeric with null strings, preserving those characters that are alphameric.

The regular expression ends in /ug. The u turns on unicode support, including the \p notation for specifying entire unicode character classes; and the g indicates global replacement, so that all non-alphanumeric characters found are replaced with the null string instead of just the first.

The regular expression is a union, created by the brackets ([]). When the first character following the open bracket is a ^, the negation of the union will be searched for (all characters that are not in any members of the union).

Inside the union we specify two unicode character classes using the \p notation:

  • \p{L}: the unicode letter class, which encompasses letters from all languages, and
  • \p{Nd}: the unicode numeric digit character class.

Examples:

console.log("1 éclair s'il vous plaît!".replace(/[^\p{L}\p{Nd}]/ug,''))
console.log("2NE1 declares 내가 제일 잘 나가!".replace(/[^\p{L}\p{Nd}]/ug,''))

Yield:

1éclairsilvousplaît
2NE1declares내가제일잘나가

Upvotes: 0

Volomike
Volomike

Reputation: 24916

If you wanted to return a replaced result, then this would work:

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

This would return:

Test123TEST

Note that the gi is necessary because it means global (not just on the first match), and case-insensitive, which is why I have a-z instead of a-zA-Z. And the ^ inside the brackets means "anything not in these brackets".

WARNING: Alphanumeric is great if that's exactly what you want. But if you're using this in an international market on like a person's name or geographical area, then you need to account for unicode characters, which this won't do. For instance, if you have a name like "Âlvarö", it would make it "lvar".

UPDATE: To support unicode alphanumeric, then the REGEXP could be changed to: /[^\p{L}\p{N}]/giu.

Upvotes: 209

Shubham Verma
Shubham Verma

Reputation: 9961

Here is the way to check:

/**
 * If the string contains only letters and numbers both then return true, otherwise false. 
 * @param string 
 * @returns boolean
 */
export const isOnlyAlphaNumeric = (string: string) => {
    return /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$/.test(string);
}

Upvotes: 0

Waruna Manjula
Waruna Manjula

Reputation: 3497

Only accept numbers and letters (No Space)

function onlyAlphanumeric(str){
  str.value=str.value.replace(/\s/g, "");//No Space
  str.value=str.value.replace(/[^a-zA-Z0-9 ]/g, "");
}
<div>Only accept numbers and letters </div>
<input type="text"  onKeyUp="onlyAlphanumeric(this);" >

Upvotes: 2

bdombro
bdombro

Reputation: 1431

For multi-language support:

var filtered = 'Hello Привет 你好 123_456'.match(/[\p{L}\p{N}\s]/gu).join('')
console.log(filtered) // --> "Hello Привет 你好 123456"

This matches any letter, number, or space in most languages.

  • [...] -> Match with conditions
  • [ab] -> Match 'a' OR 'b'
  • \p{L} -> Match any letter in any language
  • \p{N} -> Match any number in any language
  • \s -> Match a space
  • /g -> Don't stop after first match
  • /u -> Support unicode pattern matching

Ref: https://javascript.info/regexp-unicode

Upvotes: 22

Tom Zdanowski
Tom Zdanowski

Reputation: 19

Also if you were looking for just Alphabetical characters, you can use the following regular expression:

/[^a-zA-Z]/gi 

Sample code in typescript:

let samplestring = "!#!&34!# Alphabet !!535!!! is safe"

let regex = new RegExp(/[^a-zA-Z]/gi);
    let res = samplestring.replace(regex,'');

    console.log(res);

Note: if you are curious about RegEx syntax, visit regexr and either use the cheat-sheet or play with regular expressions.

Edit: alphanumeric --> alphabetical

Upvotes: 1

J. David Escobar
J. David Escobar

Reputation: 66

A little bit late, but this worked for me:

/[^a-z A-Z 0-9]+/g

a-z : anything from a to z.

A-Z : anything from A to Z (upper case).

0-9 : any number from 0 to 9.

It will allow anything inside square brackets, so let's say you want to allow any other character, for example, "/" and "#", the regex would be something like this:

/[^a-z A-Z 0-9 / #]+/g

This site will help you to test your regex before coding. https://regex101.com/

Feel free to modify and add anything you want into the brackets. Regards :)

Upvotes: 3

Darlan Dieterich
Darlan Dieterich

Reputation: 2537

Alphanumeric with case sensitive:

if (/^[a-zA-Z0-9]+$/.test("SoS007")) {
  alert("match")
}

Upvotes: 2

Greg
Greg

Reputation: 321806

/^[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

Update (supporting universal characters)

if you need to this regexp supports universal character you can find list of unicode characters here.

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

this will support persian.

Upvotes: 656

Abhin Krishna KA
Abhin Krishna KA

Reputation: 865

Save this constant

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

now, for checking part use .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

Upvotes: 2

Harrison O
Harrison O

Reputation: 1220

I have string similar to Samsung Galaxy A10s 6.2-Inch (2GB,32GB ROM) Android 9.0, (13MP+2MP)+ 8MP Dual SIM 4000mAh 4G LTE Smartphone - Black (BF19)

Below is what i did:

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

Notice i allowed ,._- then use split() and join() to replace , to - and space to - respectively.

I ended up getting something like this: samsung-galaxy-a10s-6.2-inch-2gb-32gb-rom-android-9.0-13mp-2mp-8mp-dual-sim-4000mah-4g-lte-smartphone-black-bf19-20 which is what i wanted.

There might be a better solution but this is what i found working fine for me.

Upvotes: 5

Pranav Bhat
Pranav Bhat

Reputation: 57

JAVASCRIPT to accept only NUMBERS, ALPHABETS and SPECIAL 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>

Upvotes: 3

Pranav Bhat
Pranav Bhat

Reputation: 57

Jquery to accept only NUMBERS, ALPHABETS and SPECIAL CHARECTERS

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

Enter Only Numbers:

Enter Only Alphabets:

Enter other than Alphabets and numbers like special characters:

</body>
</html>

Upvotes: -1

Abbas
Abbas

Reputation: 560

Input these code to your SCRATCHPAD and see the action.

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

Upvotes: 3

Tanmay Patel
Tanmay Patel

Reputation: 1810

Try this... Replace you field ID with #name... a-z(a to z), A-Z(A to Z), 0-9(0 to 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;
    });
});

Upvotes: 2

John Dorsey
John Dorsey

Reputation: 157

It seems like many users have noticed this these regular expressions will almost certainly fail unless we are strictly working in English. But I think there is an easy way forward that would not be so limited.

  1. make a copy of your string in all UPPERCASE
  2. make a second copy in all lowercase

Any characters that match in those strings are definitely not alphabetic in nature.

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

Optionally, you can also detect numerics by just looking for digits 0 to 9.

Upvotes: 2

Chase Seibert
Chase Seibert

Reputation: 15851

Use the word character class. The following is equivalent to a ^[a-zA-Z0-9_]+$:

^\w+$

Explanation:

  • ^ start of string
  • \w any word character (A-Z, a-z, 0-9, _).
  • $ end of string

Use /[^\w]|_/g if you don't want to match the underscore.

Upvotes: 112

Skull
Skull

Reputation: 1262

This will work

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

It accept only alphanumeriuc characters alone:
test cases pased :

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

or

You can also try this one. this expression satisfied at least one number and one character and no other special characters

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

in angular can test like:

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

PLUNKER DEMO

Refered:Regular expression for alphanumeric in Angularjs

Upvotes: 12

Nicolas Giszpenc
Nicolas Giszpenc

Reputation: 703

Extend the string prototype to use throughout your project

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

Usage:

    "I don't know what to say?".alphaNumeric();
    //Idontknowwhattosay

Upvotes: 4

Kermit the Hermit
Kermit the Hermit

Reputation: 379

Instead of checking for a valid alphanumeric string, you can achieve this indirectly by checking the string for any invalid characters. Do so by checking for anything that matches the complement of the valid alphanumeric string.

/[^a-z\d]/i    

Here is an example:

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

Notice the logical not operator at isValid, since I'm testing whether the string is false, not whether it's valid.

Upvotes: 6

Brian
Brian

Reputation: 5028

Even better than Gayan Dissanayake pointed out.

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

Now ^[a-zA-Z0-9]+$ can be represented as ^\w+$

You may want to use \s instead of space. Note that \s takes care of whitespace and not only one space character.

Upvotes: 3

Gayan Dissanayake
Gayan Dissanayake

Reputation: 479

/^([a-zA-Z0-9 _-]+)$/

the above regex allows spaces in side a string and restrict special characters.It Only allows a-z, A-Z, 0-9, Space, Underscore and dash.

Upvotes: 47

cletus
cletus

Reputation: 625337

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

or, if you want a minimum of one character:

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

Square brackets indicate a set of characters. ^ is start of input. $ is end of input (or newline, depending on your options). \s is whitespace.

The whitespace before and after is optional.

The parentheses are the grouping operator to allow you to extract the information you want.

EDIT: removed my erroneous use of the \w character set.

Upvotes: 16

Related Questions