【问题标题】:Check for existence of a keyword within a code string检查代码字符串中是否存在关键字
【发布时间】:2015-08-22 18:32:30
【问题描述】:

我正在使用 FileReader 加载 JS 文件的内容并将结果转储到 textarea 容器中。然后我想对实际的 JS 文件进行一些检查。

我知道可能已经有工具(或更好的方法),但这是针对封闭环境项目的。

在 textarea 将 JS 文件的内容作为一个大字符串包含后,我需要循环该字符串并找到 parseInt() 的所有实例,以检查它们是否提供了基数。

我会提供代码,但目前我没有任何工作。有什么想法吗?

【问题讨论】:

  • 我可能会使用 Esprima——你有来源,就这样对待它,而不是依赖于尝试通过将其视为字符串来获取可靠数据。
  • 谢谢,但不是我要找的。我需要循环一个字符串
  • 您有 JS 源代码,并且您正在尝试定位特定的方法调用。把它当作 JS 源,不要假装它是纯文本:解析它,识别调用,修复它们。如果你想以脆弱、简单、“不会处理所有情况”的方式来做,这是正则表达式或搜索的小事,假设 (a) 字符串中没有调用,(b) 没有任意表达式在parseInt 内部,这会混淆您的正则表达式/字符串搜索等。有什么问题?

标签: javascript string loops parseint


【解决方案1】:

以下 sn-p 将在您的 <textarea> 元素的字符串值中搜索 parseInt() 并输出出现次数,并在适用的情况下使用基数:

var textareaValue = 'var func = function(){' +
                    'var i = parseInt(1,1);' +
                    'var j = parseInt(10, 10);' +
                    'var k = parseInt(3) + j;' +
                    '};';
occurences = textareaValue.match(/parseInt\(.+?(, ?\d+)?\)/g);
occurences.forEach(function(occurence){
    var hasRadix = /, ?\d+\)$/.test(occurence);
    document.body.innerHTML += '<p>"' + occurence + '" has ' +
                           (hasRadix ? 'a' : 'no') + ' radix' +
                           (hasRadix ? ' (' + occurence.match(/, ?(\d+)\)$/)[1] + ')' : '') +
                           '.</p>';
});

请注意,这不是实际的语法解释,它只是文本分析。您将不得不从结果中删除,该结果包含所有出现的 parseInt() 作为字符串。此外,JavaScript 允许在有问题的文本段落中使用空格、cmets、表达式和其他巫术。您可能需要检查任何东西

实际的正则表达式/parseInt\(.+?(, ?\d+)?\)/g 将要求...

  • parseInt(比赛开始时
  • 任何字符(可能需要通过:punct: 扩展以包括括号等)
  • 作为可选组,确定是否提供基数:

    • 逗号,可选空格(可能需要使用* 响应任意数量的空格)
    • 至少一位(可能需要限制为{1,2},因为只有 2 到 36 位有效)
  • 结尾的右括号。

【讨论】:

    【解决方案2】:

    下面的函数应该能够通过简单的正则表达式匹配来区分parseInt 与基数的用法和没有基数的用法之间的区别:

    function have_radix(str){
         parseIntRegex = /parseInt\(.+?\)/g;
         parseIntRegexWithRadix = /parseInt\(.+?(,.+?\))/g;
         indices = [];
         while ( (result = parseIntRegex.exec(str)) ) {
             indices.push(result.index);
         }
         count = indices.length;
         indices = []; 
         while ( (result = parseIntRegexWithRadix.exec(str)) ) {
             indices.push(result.index);
         }
         diff = count - indices.length;
        return diff;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2017-10-17
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多