这个程序应该测试str,如果str中的每个字母都有' +'在它的两边签名然后该函数应该返回true。否则,它应该返回false。我一直收到错误"语法错误:无效的量词"。
function SimpleSymbols(str) {
var boolean = false;
for(var i=1;i<(str.length-1);i++){
if(/\w/.test(str.charAt(i))){
if(str.charAt(i-1).match('+') && str.charAt(i+1).match('+')){
boolean = true;
}else{
boolean = false;
}
}
}
str = boolean;
return str;
}
答案 0 :(得分:3)
match
用于正则表达式,因此它正在尝试将'+'
转换为正则表达式,但它失败了,因为/+/
不是有效的正则表达式(它应该是{ {1}}或'\\+'
)。但是直接测试每个角色更容易,比如:
/\+/
另请注意, if(str.charAt(i-1) == '+' && str.charAt(i+1) == '+'){
匹配任何“字”字符,包括字母,数字和下划线。要使用 字母字符,请使用/\w/
(最后的/[a-z]/i
使其不区分大小写,因此它也会匹配大写字母)。
但是反转条件似乎要简单得多。只需测试该字符串是否包含任何字母 not 包围i
符号或字符串开头或结尾处的字母,如果有,则返回+
,如这样:
false
答案 1 :(得分:3)
更容易:
function SimpleSymbols(str) {
return !str.match(/[^+]\w/) && !str.match(/\w[^+]/);
}
答案 2 :(得分:3)
您的功能的主要问题是:
您不测试第一个和最后一个字符是否为字母。从索引0
到< str.length
运行for循环应该是安全的,因为即使这会在测试str.charAt(-1)
时产生str.charAt(str.length)
和'+'
只返回""
而不是错误。或者当然,您可以继续在循环中从第二个字符到第二个字符进行测试,并为第一个和最后一个字符添加额外的测试。
.match()
方法执行正则表达式匹配,因此它会尝试将'+'
转换为正则表达式,当然+
在正则表达式中具有特殊含义且不匹配文字。我建议您只使用=== '+'
,但可以使用.match(/\+/)
。
您正在返回boolean
变量最终得到的任何值,这意味着您的函数忽略了除字符串中倒数第二个字符以外的所有字符的测试。如果您发现一封没有false
的信件,您应该立即返回'+'
。
您的问题询问“字母”,但/\w/
不测试字母,它会测试字母,数字或下划线。如果您实际上只想使用/[a-z]/i
。
(也没有分配str = boolean
,因为JS函数参数是按值传递的,所以这个赋值不会影响函数之外的任何东西。)
所以:
function SimpleSymbols(str) {
for(var i=0;i<str.length;i++){
if(/[a-z]/i.test(str.charAt(i))){
if(str.charAt(i-1)!='+' || str.charAt(i+1) != '+'){
return false;
}
}
}
return true;
}