如何用JavaScript正则表达式提取字符串中各语言对应数值?
解决方案
原代码的问题
- 变量名不一致:定义的变量是
myString,但调用match时错误使用了sonar_myString,导致ReferenceError。 - 重复定义
regexp_jsp和ncloc_jsp,属于冗余代码。 - 全局标志
g多余:每个语言键只出现一次,不需要全局匹配,match返回的数组中第一个元素就是目标值。
修正后的单正则匹配方案
直接修正变量名和冗余代码,保留你原本的正则思路:
var myString = "java=10514;js=237;jsp=3995;web=5;xml=42"; // 提取java对应数值 var regexp_java = /(?<=java=).*?(?=;|$)/; var ncloc_java = myString.match(regexp_java)[0]; // 提取js对应数值 var regexp_js = /(?<=js=).*?(?=;|$)/; var ncloc_js = myString.match(regexp_js)[0]; // 提取jsp对应数值 var regexp_jsp = /(?<=jsp=).*?(?=;|$)/; var ncloc_jsp = myString.match(regexp_jsp)[0]; // 提取web对应数值 var regexp_web = /(?<=web=).*?(?=;|$)/; var ncloc_web = myString.match(regexp_web)[0]; // 提取xml对应数值 var regexp_xml = /(?<=xml=).*?(?=;|$)/; var ncloc_xml = myString.match(regexp_xml)[0]; // 测试输出 console.log(ncloc_java); // "10514" console.log(ncloc_js); // "237" console.log(ncloc_jsp); // "3995" console.log(ncloc_web); // "5" console.log(ncloc_xml); // "42"
更高效的批量处理方案
如果语言类型较多,推荐一次性提取所有键值对,再转换为变量,代码更简洁:
var myString = "java=10514;js=237;jsp=3995;web=5;xml=42"; var ncloc = {}; // 用正则批量匹配所有键值对 var regex = /(\w+)=(\d+)/g; let match; while ((match = regex.exec(myString)) !== null) { ncloc[match[1]] = match[2]; } // 提取到单独变量 var ncloc_java = ncloc.java; var ncloc_js = ncloc.js; var ncloc_jsp = ncloc.jsp; var ncloc_web = ncloc.web; var ncloc_xml = ncloc.xml; // 测试输出 console.log(ncloc_java); // "10514" console.log(ncloc_js); // "237"
或者用字符串分割实现(无需正则):
var myString = "java=10514;js=237;jsp=3995;web=5;xml=42"; var ncloc = {}; // 分割为键值对数组后逐一处理 myString.split(';').forEach(pair => { const [key, value] = pair.split('='); ncloc[key] = value; }); // 提取变量 var ncloc_java = ncloc.java; var ncloc_js = ncloc.js; // ...其他变量同理
内容的提问来源于stack exchange,提问作者Cesare
相关产品推荐
相关产品推荐

