ChatGPT解决这个技术问题 Extra ChatGPT

Check whether a string matches a regex in JS

I want to use JavaScript (can be with jQuery) to do some client-side validation to check whether a string matches the regex:

^([a-z0-9]{5,})$

Ideally it would be an expression that returned true or false.

I'm a JavaScript newbie, does match() do what I need? It seems to check whether part of a string matches a regex, not the whole thing.

Do you want a complete match, or just whether the string contains a matching substring?
A complete match - not a matching substring.

C
Code Maniac

Use regex.test() if all you want is a boolean result:

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

...and you could remove the () from your regexp since you've no need for a capture.


What does the initial ^ in the regex does there?
@PedroD ^ implies begining or starts with
So how would you do the opposite? "doesn't start with..."
@stackdave are you perhaps working with Java, rather than JavaScript?
K
KeaganFouche

Use test() method :

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

Note that the version with RegExp allows to inject variable values into the regex string.
had to remove double quotes in new RegExp("^([a-z0-9]{5,})$") in order to make it work
p
pmrotule

You can use match() as well:

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

But test() seems to be faster as you can read here.

Important difference between match() and test():

match() works only with strings, but test() works also with integers.

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true

The reason it works with a number is because the number is coerced into a string, because it's given as a parameter when it's expecting a string. I wouldn't rely on this behavior. It depends on your environment's implementation of test(). (match fails because numbers don't have a match member). I'd reccomend explicitly converting your number to a string if you want to use it with a regex (String(123) for example).
The match can be used here, but if you look at performance, test performs 30% better when we just want to validate a string to match the regex and not extract substrings from it.
@pmrotule Yeah, but it should be mentioned before match description.
The most significant difference between test and match (and matchAll) is that match does things like to return a list of all matching sub-strings, while test only checks if there are any. Check the regex methods in javascript.info/regexp-methods
J
J0e3gan

Use /youregexp/.test(yourString) if you only want to know whether your string matches the regexp.


d
dota2pro

let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; let regexp = /[a-d]/gi; console.log(str.match(regexp));


K
Kostanos

Here's an example that looks for certain HTML tags so it's clear that /someregex/.test() returns a boolean:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

Remember to indicate ^ for beginning of the string and $ for the end, if you want to test the exact match of entire string.

Example:

/[a-z]+/.test('aaa111'); // true
/^[a-z]+$/.test('aaa111'); // false

P
Penny Liu

const regExpStr = "^([a-z0-9]{5,})$" const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search console.log(result) // true if it matched, false if it doesn't


K
Kamil Kiełczewski

try

 /^[a-z\d]{5,}$/.test(str)

console.log( /^[a-z\d]{5,}$/.test("abc123") ); console.log( /^[a-z\d]{5,}$/.test("ab12") );


What new value does this code-only answer bring to the page?
currently it is shortest solution (due to regexp simplification)
J
Juan Navarrete

I would recommend using the execute method which returns null if no match exists otherwise it returns a helpful object.

let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
console.log(case1); //null

let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]

T
Tongi

You can try this, it works for me.

 <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>

 <script type="text/javascript">
    function CheckValidAmount(amount) {          
       var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
       if(amount.match(a)){
           alert("matches");
       }else{
        alert("does not match"); 
       }
    }
</script>

J
Jaber Alshami

please try this flower:

/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('abc@abc.abc');

true


M
Madhusoodan P

If you don't want ^ and $ around the regex (I had such a usecase) you can do something like

let reg = /[a-zA-Z0-9]+/g
let txt = "hello"
let matches = reg.exec(txt)[0] == txt
console.log(`It ${matches ? "does" : "doesn't"} match`)

S
Sufiyan Ansari

Update/Add

If the query string does not present in the URL then the below solution will work to add the param in the URL, if it already exists then it will update.

function updateUrlParameter(url, param, value) {
  var regex = new RegExp("(?<=[?|&])(" + param + "=)[^&]+", "i");
  if (regex.test(url)) {
    return url.replace(regex, param + "=" + value);
  } else {
    if (window.location.search) {
      return `${url}&${param}=${value}`;
    }else{
      return `${url}?${param}=${value}`;
    }
  }
}