正则表达式 - 无法在条件语句(JavaScript)中使用正则表达式变量

时间:2017-07-20 21:03:23

标签: javascript regex

我已经创建了一个正则表达式作为变量,但是当我在条件语句中调用该变量来测试正则表达式时,如果失败。

以下是我的代码:

var str = "SERR PBQR PNZC!";

var newStr = [];

var pattern = new RegExp('^[A-Z0-9!@#$%^&*)(+=._-]+$', '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", " "]

上面输出数组中的所有单词并占据空格,但它也改变了我的“!”也是一个空格(这就是我在我的array.map中尝试验证的原因)。

我知道验证有效,因为当我手动输入“!”时,它会检出。任何人都可以解释我在这里使用正则表达式出错了吗?我在网上找到的任何内容似乎都对我有用。

PS我也试过“/^[a-zA-Z0-9!@#\$%\^\&*)(+=.--]+$/g”以及“/! /“哪个不起作用。

3 个答案:

答案 0 :(得分:0)

这一行错了:

var pattern = new RegExp("/^[a-zA-Z0-9!@#\$%\^\&*\)\(+=._-]+$/g");

使用RegExp构造函数定义正则表达式对象的方法是:(带字符串)

var pattern = new RegExp('^[A-Z0-9!@#$%^&*)(+=._-]+$', 'i');

或(使用文字模式)

var pattern = new RegExp(/^[A-Z0-9!@#$%^&*)(+=._-]+$/i);

您也可以简单地写:

var pattern = /^[A-Z0-9!@#$%^&*)(+=._-]+$/i;

使用带有^$锚定模式的g标记是没用的。

另请注意,您不必转义字符类中的特殊字符。

您要对if (val == pattern) {所做的事情一点都不清楚。

我认为你要做的是:

var str = "SERR PBQR PNZC!";

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

if ( /^[A-Z0-9!@#$%^&*)(+=._ -]+$/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);
}

答案 1 :(得分: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);

答案 2 :(得分:-1)

您正在使用返回数组的.match或null。如果要在条件中使用正则表达式,则需要使用返回布尔值的.test。阅读有关JS正则表达式here的更多信息。