【问题标题】:Whats wrong with this regex logic这个正则表达式逻辑有什么问题
【发布时间】:2016-05-07 03:53:21
【问题描述】:

我试图在等号后获取值,它可以工作,但我得到重复的值,知道这里有什么问题吗?

 // Regex for finding a word after "=" sign
 var myregexpNew = /=(\S*)/g;
 // Regex for finding a word before "=" sign
 var mytype = /(\S*)=/g;
 //Setting data from Grid Column
 var strNew = "QCById=20";
 var matchNew = myregexpNew.exec(strNew);
 var newtype = mytype.exec(strNew);
 alert(matchNew);

https://jsfiddle.net/6vjjv0hv/

【问题讨论】:

  • 你能重写逻辑吗?
  • 是的,我当然可以,但是我不会,因为这不是一个“免费为我编写代码”的网站。
  • 这就是为什么您不使用警报进行调试的原因。打开浏览器的 JS 控制台,改用console.log

标签: javascript jquery regex


【解决方案1】:

exec 返回一个数组,第一个元素是全局匹配,下面是子匹配,这就是你得到["=20", "20"] 的原因(在这里使用console.log 而不是alert 会使你得到的更清楚)。

在查找子匹配项并使用exec 时,您通常对索引1 开始的元素感兴趣。

关于整个解析,显然有更好的解决方案,比如只使用一个带有两个子匹配的正则表达式,但这取决于真正的目标。

【讨论】:

    【解决方案2】:

    你不会得到重复的值,你只会得到一个匹配值的数组和捕获的文本 #1。

    RegExp#exec()帮助:

    如果匹配成功,exec() 方法返回一个数组并更新正则表达式对象的属性。 返回的数组匹配的文本作为第一项,然后每个捕获匹配的括号的一项包含捕获的文本。

    只需使用[1] 索引即可仅获取捕获的文本。

    var myregexpNew = /=(\S*)/g;
     var strNew = "QCById=20";
     var matchNew = myregexpNew.exec(strNew);
     if (matchNew) {
        console.log(matchNew[1]);
     }

    要获取=两边的值,可以使用/(\S*)=(\S*)/g正则表达式:

    var myregexpNew = /(\S*)=(\S*)/g;
    var strNew = "QCById=20";
    var matchNew = myregexpNew.exec(strNew);
    if (matchNew) {
      console.log(matchNew[1]);
      console.log(matchNew[2]);
    }

    此外,您可能需要添加检查以查看捕获的值是否不是undefined/empty,因为\S* 可能会捕获一个空字符串。 使用/(\S+)=(\S+)/g 正则表达式,要求在= 符号前后至少出现一个非空白字符。

    【讨论】:

      【解决方案3】:

      您可以尝试不使用 Regex,如下所示:

      var val = 'QCById=20';
      var myString = val.substr(val.indexOf("=") + 1);
      alert(myString);

      目前exec 正在返回匹配的值。

      【讨论】:

      • 我推荐您提供不使用正则表达式的解决方案,但请提供同时呈现左侧和右侧的解决方案。
      【解决方案4】:

      REGEXP.exec(SOMETHING) 返回一个数组(参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)。 数组中的第一项是完全匹配,其余匹配括号内的子字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多