Javascript 如果每个字母都有'+';在它的两面签字
这个程序应该测试str,如果str中的每个字母两边都有一个“+”号,那么函数应该返回true。否则,它应该返回false。我一直收到错误“SyntaxError:invalid quantifier” 函数SimpleSymbols(str){ 布尔值=false;Javascript 如果每个字母都有'+';在它的两面签字,javascript,regex,boolean,symbols,Javascript,Regex,Boolean,Symbols,这个程序应该测试str,如果str中的每个字母两边都有一个“+”号,那么函数应该返回true。否则,它应该返回false。我一直收到错误“SyntaxError:invalid quantifier” 函数SimpleSymbols(str){ 布尔值=false; for(var i=1;imatch用于正则表达式,因此它试图将'+'转换为正则表达式,但它失败了,因为/+/不是有效的正则表达式(它应该是'\+'或/\+//code>)。但直接测试每个字符更容易,如下所示: if(str.c
for(var i=1;i
match
用于正则表达式,因此它试图将'+'
转换为正则表达式,但它失败了,因为/+/
不是有效的正则表达式(它应该是'\+'
或/\+//code>)。但直接测试每个字符更容易,如下所示:
if(str.charAt(i-1) == '+' && str.charAt(i+1) == '+'){
function SimpleSymbols(str) {
return ! /(^|[^+])[a-z]|[a-z]([^+]|$)/i.test(str);
}
还请注意,/\w/
匹配任何“word”字符,包括字母、数字和下划线。要仅使用字母字符,应使用/[a-z]/i
(末尾的i
使其不区分大小写,因此它也将匹配大写字母)
但反转条件似乎要简单得多。只需测试字符串是否包含任何未被+
符号包围的字母或字符串开头或结尾的字母,如果包含,则返回false
,如下所示:
if(str.charAt(i-1) == '+' && str.charAt(i+1) == '+'){
function SimpleSymbols(str) {
return ! /(^|[^+])[a-z]|[a-z]([^+]|$)/i.test(str);
}
更容易:
function SimpleSymbols(str) {
return !str.match(/[^+]\w/) && !str.match(/\w[^+]/);
}
您的功能存在的主要问题有:
您不需要测试第一个和最后一个字符是否为字母。从索引0
到
运行for循环应该是安全的,因为即使这会导致str.charAt(-1)
和str.charAt(str.length)
在测试'+'
时,它们只会返回“
而不是错误。当然,您也可以继续从循环中的第二个字符到最后一个字符进行测试,并为第一个和最后一个字符添加额外的测试
.match()
方法进行正则表达式匹配,因此它尝试将'+'
转换为正则表达式,当然+
在正则表达式中具有特殊意义,并且与文本不匹配。我建议改为使用=='+'
,尽管您可以使用.match(/\+/)
您返回的是布尔值
变量的最终值,这意味着您的函数将忽略对字符串中除最后一个字符以外的所有字符的测试。如果您发现一个字母周围没有“+”
,则应立即返回false
您的问题是关于“字母”的,但是/\w/
不测试字母,而是测试字母、数字或下划线。如果您实际上只想要字母,请使用/[a-z]/i
(分配str=boolean
也没有意义,因为JS函数参数是按值传递的,所以此分配不会影响函数之外的任何内容。)
因此:
函数SimpleSymbols(str){
对于(var i=0;我在这里回答了一个类似的问题,如果你想有一些解决方案,这是很好和简洁的,但是对于“a+b”
和“2+1”
,它们都不满足OP的要求。对于“a+b”
和“a+bb”
和“a+bb”
和“aa+bb”,你的反向条件版本返回true
。这是怎么回事?'return!!/\+[a-z]\+/.test(str);@user3196340,如果字符串中的任何位置包含像'+a+'
这样的字符序列,它将返回\+[a-z]\+/.test('+a+foo')这样的/\+[a-z]\+/.test,它不会在意其他字母是否被+
包围→ true
。现在我们正在烹饪。+1。@user3196340这是一种替代;您可以将其视为含义或。正则表达式引擎将首先尝试匹配左侧(周围组中)的任何内容,如果无法匹配,则将尝试匹配右侧的任何内容。例如,/foo | bar/
将匹配字符串'foo'
和'bar'
,但不匹配'baz'
。