正则表达式返回未定义

问题描述 投票:1回答:4

我正在尝试初学者coderByte挑战之一,Simple Symbols。挑战总结如下。

“使用JavaScript语言,让函数SimpleSymbols(str)传递str参数并通过返回字符串true或false来确定它是否是可接受的序列.str参数将由+=符号组成,它们之间有几个字母(即.++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

javascript regex string
4个回答
1
投票

See regex in use here

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

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

Usage

请注意,下面的有效/无效字符串是根据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]*匹配集合中的任意数量的字符(+=或数字)
  • $在线的末尾断言位置

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+'));

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+'));

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+'));

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

再次感谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.