Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript - insert a variable into regexp

I have the following which works fine, allowing a form field to be valid if blank or containing the word "hello" or passing the other validation...

var re = new RegExp(/^$|^[hello]|^([FG]?\d{5}|\d{5}[AB])$/);

but I want to make the word "hello" be the value of a variable.

I have tried this but it no longer seems to work:

var i = "hello";
var re = new RegExp('/^$|^['+i+']|^([FG]?\d{5}|\d{5}[AB])$/');
like image 882
Tom Avatar asked Dec 16 '22 20:12

Tom


2 Answers

There are several things wrong in your code.

  • RegExp expects a string, not a regex literal like you pass in the first case. It seems that RegExp is smart enough though and detects that you are passing a regex literal. So your first example works by coincidence and is the same as:

    var re = /^$|^[hello]|^([FG]?\d{5}|\d{5}[AB])$/;
    
  • The / are not part of the expression, they are the delimiters to denote a regex literal, much like quotation marks (') indicate a string literal. Hence, if you pass the expression as string to RegExp, it should not contain /.

  • Since the backslash is the escape character in strings as well, in order to create a literal backslash for the expression you have to escape it: \\.

  • [hello] does not test for for the word hello, it matches either h, e, l or o, thus it is equivalent to [ehlo].

With all that said, your code should be:

var i = "hello";
var re = new RegExp('^$|^'+i+'|^([FG]?\\d{5}|\\d{5}[AB])$');
like image 168
Felix Kling Avatar answered Dec 26 '22 20:12

Felix Kling


Drop the leading and trailing / characters and your reg exp is not going what you expect. Double up the \ characters so they are escaped. Also [] means match any of these characters.

Basic example

var str = "hello world";
var word = "hello"
var re = new RegExp("^" + word + "\\s?")
console.log( str.match(re) );
like image 45
epascarello Avatar answered Dec 26 '22 20:12

epascarello