正则表达式返回未定义

时间:2017-12-18 20:43:26

标签: javascript regex string

我正在尝试初学者coderByte挑战之一,简单符号。挑战总结如下。

“使用JavaScript语言,让函数SimpleSymbols(str)获取传递的str参数,并通过返回字符串true或false来确定它是否是可接受的序列.st参数将被组成+=符号之间有多个字母(即。++d+===+c++==a),并且字符串为true,每个字母必须用+符号包围。所以左边的字符串将为false。字符串不会为空,并且至少有一个字母。“

function SimpleSymbols(str){
  var RegExp = /\+\w\+/gi;
  var regexp1 = /^\w/gi;
  var regexp2 = /\w$/g;

  if(regexp1.test(str) == true){
    return false
  } else if(regexp2.test(str) == true){
    return false
  } else if(RegExp == true){
    return true
  }                       

}

console.log(SimpleSymbols('+d+=3=+s+'));
console.log(SimpleSymbols('f++d+'));

我正在测试的第一个正则表达式/^\w/gi返回undefined,我无法找出原因?
https://regex101.com/是我之前使用的一个很棒的工具,我的表达式确实将f标识为字符串中的第一个字符,但是当我在codepen中测试它时,它会返回undefined in控制台。

4 个答案:

答案 0 :(得分:1)

代码

See regex in use here

^[+=\d]*\+(?:[a-z]\+[+=\d]*)+$

或者,使用相反的逻辑(捕获无效字符串而不是有效字符串),您可以使用(?:^|[^+])[a-z]|[a-z](?:[^+]|$)

用法

请注意,以下有效/无效字符串是根据OP对有效无效字符串的说明创建的:each letter must be surrounded by a + symbol.和可以在字符之间共享加号+,以使+a+a+有效(在问题下方的评论中指定)。



var a = [
  // valid
  "++d+===+c++==+a++",
  "+a+a+a+",
  "+a++a+",
  "+a+",
  // invalid
  "++d+===+c++==a",
  "+=d+",
  "+dd+",
  "+d=+",
  "+d+d",
  "d+d+"
];
var r = /^[+=\d]*\+(?:[a-z]\+[+=\d]*)+$/mi;

a.forEach(function(s){
 console.log(r.test(s));
});




说明

  • ^在行首处断言位置
  • [+=\d]*匹配集合中的任意数量的字符(+=或数字)
  • \+匹配文字加号+
  • (?:[a-z]\+[+=\d]*)+匹配以下一项或多项内容
    • [a-z]匹配小写ASCII字母
    • \+匹配文字加号+
    • [+=\d]*匹配集合中的任意数量的字符(+=或数字)
  • $断言行尾的位置

答案 1 :(得分:0)

它返回undefined,因为您的表达式不符合任何条件。由于您没有定义其他{},因此没有返回任何内容。因此你得到了不确定。试试这个:

function SimpleSymbols(str){
  var RegExp = /\+\w\+/gi;
  var regexp1 = /^\w/gi;
  var regexp2 = /\w$/g;

  if(regexp1.test(str) == true){
    return false
  } else if(regexp2.test(str) == true){
    return false
  } else if(RegExp == true){
    return true
  } else {
    return "catch all here";
  }

}

console.log(SimpleSymbols('+d+=3=+s+'));
console.log(SimpleSymbols('f++d+'));

答案 2 :(得分:0)

您可以使用单个正则表达式和string.test()方法(只返回true / false )。

以下是两种不同的方法(正则表达式)。

首先在单词字符之间需要单独的+。示例+a++b+(true)

 ^ 
 (?: [+=]* \+ \w \+ [+=]* )+
 $

第二个可以在单词字符之间采用共同的+。示例+a+b+(true)

 ^ 
 (?:
      [+=]* \+ \w 
      (?= \+ )
 )+
 [+=]* 
 $

var patt1 = new RegExp("^(?:[+=]*\\+\\w\\+[+=]*)+$");
function SimpleSymbols_1(str){
   return patt1.test(str);
}

var patt2 = new RegExp("^(?:[+=]*\\+\\w(?=\\+))+[+=]*$");
function SimpleSymbols_2(str){
   return patt2.test(str);
}

console.log(SimpleSymbols_1('+d+=3=+s+'));
console.log(SimpleSymbols_1('f++d+'));
console.log(SimpleSymbols_1('+a+b+c+'));

console.log(SimpleSymbols_2('+a+b+c+'));
console.log(SimpleSymbols_2('+a+=+c+'));
console.log(SimpleSymbols_2('+a++c+'));

答案 3 :(得分:0)

谢谢大家以我的方式提出一些支持/评论。同样,我是JavaScript的新手,而正则表达式对我来说相当陌生,尽管我在理解它们方面获得了一些牵引力。这是我发布的更新解决方案。这很复杂,也许是一种更不优雅和非简单的方法来得出正确的答案,但它确实有效。

function SimpleSymbols(str){
  var RegExp = /\+[a-z]\+/gi;
  var regexp1 = /^[a-z]/gi;
  var regexp2 = /[a-z]$/g;
  var regexp3 = /[a-z]\=/gi;
  var regexp4 = /\=[a-z]/gi;

  if(regexp1.test(str) === true){
    return false
  } else if(regexp2.test(str) === true){
    return false
  } else if(regexp3.test(str) === true){
    return false
  } else if(regexp4.test(str) === true){
    return false
  } else {
    return true
  }                      
}

console.log(SimpleSymbols('+d+=3=+s+'));
console.log(SimpleSymbols('f++d+'));
console.log(SimpleSymbols('+d===+a+'));
console.log(SimpleSymbols('+a='));
console.log(SimpleSymbols('2+a+a+'));
console.log(SimpleSymbols('==a+'));

我确信必须有一种方法只能使用一个正则表达式,但同样,我仍然是一个非常新手。

再次感谢大家。