我正在尝试初学者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控制台。
答案 0 :(得分:1)
^[+=\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+'));
我确信必须有一种方法只能使用一个正则表达式,但同样,我仍然是一个非常新手。
再次感谢大家。