【问题标题】:Test String if each letter has '+' sign on both sides of it测试字符串,如果每个字母的两边都有“+”号
【发布时间】:2014-02-16 23:49:59
【问题描述】:

这个程序应该测试 str,如果 str 中的每个字母在它的两边都有一个“+”号,那么函数应该返回 true。否则,它应该返回 false。我不断收到错误“SyntaxError:无效量词”。

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; 

}

【问题讨论】:

标签: javascript regex boolean symbols


【解决方案1】:

你的函数的主要问题是:

  1. 您不测试第一个和最后一个字符是否为字母。从索引0&lt; str.length 运行for 循环应该是安全的,因为即使在测试'+' 时这会导致str.charAt(-1)str.charAt(str.length),这些只是返回"" 而不是错误。或者,您当然可以继续从循环中的第二个字符到倒数第二个字符进行测试,并为第一个和最后一个字符添加额外的测试。

  2. 1234563我建议只使用=== '+',尽管您可以使用.match(/\+/)
  3. 您将返回 boolean 变量最终得到的任何值,这意味着您的函数将忽略字符串中除倒数第二个字符之外的所有字符的测试。如果您发现周围没有'+' 的字母,应立即返回false

  4. 您的问题涉及“字母”,但/\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;
}

【讨论】:

    【解决方案2】:

    match 用于正则表达式,因此它试图将'+' 转换为正则表达式,但它失败了,因为/+/ 不是有效的正则表达式(它应该是'\\+'/\+/ )。但是直接测试每个字符会更容易,如下所示:

      if(str.charAt(i-1) == '+' && str.charAt(i+1) == '+'){
    

    另请注意,/\w/ 匹配任何“单词”字符,包括字母、数字和下划线。要处理 只是 字母字符,应使用 /[a-z]/i(末尾的 i 使其不区分大小写,因此它也会匹配大写字母)。

    但是反转条件似乎要简单得多。只需测试字符串是否包含任何被+ 符号包围的字母not 或字符串开头或结尾的字母,如果包含则返回false,如下所示:

    function SimpleSymbols(str) { 
        return ! /(^|[^+])[a-z]|[a-z]([^+]|$)/i.test(str);
    }
    

    【讨论】:

    • 您的反转条件版本对于 "a+b""a+bb""aa+bb" 返回 true。
    • 怎么样? '返回 !! /\+[a-z]\+/.test(str);'
    • @user3196340 如果它在字符串中的任何位置包含一些像'+a+' 这样的字符序列,它将返回true。它不会关心其他字母是否没有被+包围,例如/\+[a-z]\+/.test('+a+foo')true.
    • 现在我们正在做饭。 +1。
    • @user3196340 这是一个替代方案;你可以把它想象成的意思。正则表达式引擎将首先尝试匹配左侧(周围组内)的任何内容,如果无法匹配,则将尝试匹配右侧的任何内容。例如,/foo|bar/ 将匹配字符串 'foo''bar',但不匹配 'baz'
    【解决方案3】:

    容易多了:

    function SimpleSymbols(str) {
        return !str.match(/[^+]\w/) && !str.match(/\w[^+]/);
    }
    

    【讨论】:

    • 这很好,很简洁,但是对于"a+b""2+1",它返回true,它们都不符合OP 的要求。
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多