4

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])$/');
4

2 に答える 2

10

あなたのコードにはいくつかの間違いがあります。

  • RegExp最初のケースで渡すような正規表現リテラルではなく、stringが必要です。それRegExpは十分に賢いようですが、正規表現リテラルを渡していることを検出します。したがって、最初の例は偶然に機能し、次と同じです。

    var re = /^$|^[hello]|^([FG]?\d{5}|\d{5}[AB])$/;
    
  • は式の一部で/なく'、引用符 ( ) が文字列リテラルを示すように、正規表現リテラルを示す区切り文字です。したがって、式を文字列として に渡す場合、 をRegExp含むべきではありません/

  • バックスラッシュは文字列のエスケープ文字でもあるため、式のリテラル バックスラッシュを作成するには、エスケープする必要があります\\

  • [hello]は単語 をテストしません。 、、またはのhelloいずれかに一致するため、 と同等です。helo[ehlo]

とはいえ、コードは次のようになります。

var i = "hello";
var re = new RegExp('^$|^'+i+'|^([FG]?\\d{5}|\\d{5}[AB])$');
于 2012-08-14T14:38:40.383 に答える
2

先頭と末尾の/文字を削除すると、正規表現は期待どおりになりません。\エスケープされるように文字を2 倍にします。また[]、これらの文字のいずれかに一致することを意味します。

基本的な例

var str = "hello world";
var word = "hello"
var re = new RegExp("^" + word + "\\s?")
console.log( str.match(re) );
于 2012-08-14T14:34:16.623 に答える