【问题标题】:What's the best/fastest way to find the number of tabs to start a string?找到开始字符串的制表符数量的最佳/最快方法是什么?
【发布时间】:2022-02-15 03:57:19
【问题描述】:

我想在字符串的开头找到制表符的数量(当然我希望它是快速运行的代码;))。这是我的想法,但不确定这是否是最佳/最快的选择:

//The regular expression
var findBegTabs = /(^\t+)/g;

//This string has 3 tabs and 2 spaces: "<tab><tab><space>something<space><tab>"
var str = "      something  ";

//Look for the tabs at the beginning
var match = reg.exec( str );

//We found...
var numOfTabs = ( match ) ? match[ 0 ].length : 0;

另一种可能是使用循环和charAt:

//This string has 3 tabs and 2 spaces: "<tab><tab><space>something<space><tab>"
var str = "      something  ";

var numOfTabs = 0;
var start = 0;

//Loop and count number of tabs at beg
while ( str.charAt( start++ ) == "\t" ) numOfTabs++;

【问题讨论】:

  • 您在第一个示例中使用了不同的变量名,并且) ) 出现了拼写错误。
  • 不好意思,我只是写在stackoverflow的textarea里。我会解决的。
  • 另外,现在,在 ES6 中,您可以使用如下正则表达式:'\t\tabc'.match(/\t/gy) || '').length

标签: javascript regex optimization


【解决方案1】:

general中,如果您可以通过简单地遍历字符串并在每个索引处进行字符检查来计算数据,这将比必须构建更复杂的正则表达式/正则表达式更快搜索引擎。我鼓励您对此进行分析,但我认为您会发现直接搜索更快。

注意:您的搜索应在此处使用 === 而不是 ==,因为您不需要在相等检查中引入转换。

function numberOfTabs(text) {
  var count = 0;
  var index = 0;
  while (text.charAt(index++) === "\t") {
    count++;
  }
  return count;
}

【讨论】:

  • 为什么空字符串或所有选项卡都会出错? charAt() 仍然返回与 "\t" 相当的值。
  • @patrick 不会。我仍然在考虑严格的代码,这会在索引超出范围与只会返回未定义的javascript。会更新
  • 谢谢。是的,不需要检查 text.length,因为 javascript 仍然返回可比较的值而不是抛出错误。
【解决方案2】:

尝试使用profiler(例如jsPerfmany available backend profilers 之一)在您的目标系统(您计划为您的软件支持的浏览器和/或解释器)上创建和运行基准测试。

根据您的预期数据和目标系统推断哪种解决方案的性能最好是有用的;但是,您有时可能会惊讶于哪种解决方案实际上执行得最快,尤其是在大哦分析和典型数据集方面。

在您的特定情况下,迭代字符串中的字符可能比正则表达式操作更快。

【讨论】:

  • @IAbstractDownvoteFactory - 我创建了另一个 - jsperf.com/regex-vs-indexof-in-loop
  • 肖恩,谢谢你这样做!这些测试的问题在于它们按顺序进行,并且您在浏览器中运行的循环越多,下一个循环的速度就越慢,因为浏览器正在使用 ram 和 cpu。我发现如果你先运行代码 A 然后运行代码 B,然后切换它们并再次尝试测试,你会得到第一个几乎总是更快。
  • maerics,不知道。我投了赞成票。它在我的顶部三角形上显示 +1 和橙色。
  • @maerics - 您在查看自己的帖子吗?!你为什么要链接到 jsPerf。它与问题无关,不是答案
  • @checklist:因为 OP 询问如何确定他提出的最快的解决方案,而我的回答是“为您的目标系统使用分析器”。
【解决方案3】:

单线(如果你发现最小的最好):

"\t\tsomething".split(/[^\t]/)[0].length;

即由所有非制表符分割,然后获取第一个元素并获取其长度。

【讨论】:

  • OP 明确表示他们对“最快”感兴趣,而不是“最小”。 regex 和 split 可能不会参与最快的解决方案。
  • 同意jfriend00,split是个慢功能。但感谢您的帮助! :)
猜你喜欢
  • 2014-03-19
  • 2012-03-15
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多