2017-07-20 8 views
-2

私は変数として正規表現を作成しましたが、正規表現をテストするためにその変数を呼び出すと失敗します。以下は regex - 条件文(JavaScript)でregex変数を使用できません

が私のコードです:「!」

var str = "SERR PBQR PNZC!"; 

var newStr = []; 

var pattern = new RegExp('^[[email protected]#$%^&*)(+=._-]+$', 'i'); // corrected 

/* 
Matches first 13 and then last 13 charcters of alphabet and adds 13 to 
Unicode character and remove 13 respectively. Final Unicode values get added 
to array. If the character is not part of alphabet, character remains as is 
and is also pushed to array. 
*/ 
for (var i = 0; i < str.length; i++) { 
    if (str[i].match(/^[A-M]*$/)) { 
     newStr.push(str.charCodeAt(i) + 13); 
    } else if (str[i].match(/^[N-Z]*$/)) { 
     newStr.push(str.charCodeAt(i) - 13); 
    } else { 
     newStr.push(str[i]); 
    } 

/* 
If statement used for special character validation as defined by regex 
pattern variable. Special characters are ignored and pushed to newWord 
array, Unicode characters mapped back to alphabet and pushed to newWord 
array. 
*/ 
var newWord = newStr.map(function (val) { 
    if (val == pattern) { 
     return val; 
    } else { 
     return String.fromCharCode(val); 
    } 
}); 

} 

console.log(newWord); 

//["F", "R", "E", "E", " ", "C", "O", "D", "E", " ", "C", "A", "M", "P", " "] 

上記出力アレイ内のすべての単語や空白を占め、それはしかし、また私の変更します(これが私の配列の中で検証を試みている理由です。map)。

私は手作業で "!"を入力するとチェックが行われるので、検証作業が分かります。誰も私がここで正規表現を使用して間違っていると説明することができますか?私がオンラインで見つけたものは、私のために働いたとは思われません。

PS「/^[a-zA-Z0-9!@#\ $%\^\ & *(+ = ._-] + $/g」と「/! /」動作しませんでした。

+0

あなたは 'RegExp'コンストラクタの代わりに、正規表現リテラル構文を使用していますが、' RegExp'のコンストラクタに渡す文字列内のバックスラッシュをエスケープしていません。 – 4castle

+0

'pattern'は正規表現オブジェクトですが、それを配列と比較できますか? – sln

+0

特に 'RegExp'コンストラクタについて、ドキュメントをもっと詳しく読んでください。 –

答えて

0

。問題は2倍であった、1)正規表現が正しく定義されていなかった、2)正規表現が配列の要素に直接使用されていて、文字列(私はこれまで認識していなかった)でしか使用できなかった。

コードの修正は以下の通りです:

var str = "SERR PBQR PNZC!"; 

var newStr = []; 

var pattern = new RegExp(/^[^\w]$/, 'i'); // corrected 

//Matches alphabetical characters (A-M and N-Z) and converts to unicode to 
add/remove 13 from value. 
for (var i = 0; i < str.length; i++) { 
    if (str[i].match(/^[A-M]*$/)) { 
     newStr.push(str.charCodeAt(i) + 13); 
    } else if (str[i].match(/^[N-Z]*$/)) { 
     newStr.push(str.charCodeAt(i) - 13); 
    } else { 
     newStr.push(str[i]); 
    } 

// If statement used for special character validation and to convert 
unicode to alphabet. 
var newWord = newStr.map(function (val) { 
    if (val.toString().match(pattern)) { // corrected 
     return val; 
    } else { 
     return String.fromCharCode(val); 
    } 
}); 

} 

console.log(newWord); 
-1

あなたは、配列またはnullを返す.matchを使用している。あなたは条件付きで正規表現を使用する場合は、ブール値を返す.testを使用する必要があります。JSの正規表現についての詳細を読むhere

0

この行は間違っている:

var pattern = new RegExp("/^[[email protected]#\$%\^\&*\)\(+=._-]+$/g");

のRegExpコンストラクタを持つ正規表現オブジェクトを定義する方法のいずれかである:(文字列で)

var pattern = new RegExp('^[[email protected]#$%^&*)(+=._-]+$', 'i'); 

または

var pattern = new RegExp(/^[[email protected]#$%^&*)(+=._-]+$/i); 

あなたは、単に書くことができます(リテラルパターンで):

var pattern = /^[[email protected]#$%^&*)(+=._-]+$/i; 

^$で固定されたパターンでgフラグを使用することは無意味です。

文字クラス内で特殊文字をエスケープする必要はありません。

if (val == pattern) {でしようとしていることはまったく明確ではありません。


私はあなたがやろうとしているものだと思うがある:私はこの1つの並べ替えを取得するために管理

var str = "SERR PBQR PNZC!"; 

// validation: test if the string contains only allowed characters 

if (/^[[email protected]#$%^&*)(+=._ -]+$/i.test(str)) { 

    // translation: 
    var newstr = str.replace(/([a-m])|[n-z]/gi, function (m,g) { 
     return String.fromCharCode(m.charCodeAt(0) + (g ? 13 : -13)); 
    }, str); 

    console.log(newstr); 
} 
+0

コードにコメントが追加されました。'if(val == pattern){'はマッピング中の配列に特殊文字(この場合は "!")が含まれているかどうかを調べることを試みています。要素が特殊文字でない場合は、Unicode文字で表されるアルファベットの値に変換されます。私が手動で "!" If条件で 'if(val =="! "){'、それは動作しますが、正規表現パターンのプレースホルダー変数は動作しません。これは私の正確な問題です。私はあなたの正規表現の修正(文字列とリテラル)を試して、それはまだ解決されません – DaftVader

関連する問題