在我的代码中,我基于_分割字符串并获取数组中的第二项。

var element = $(this).attr('class');
var field = element.split('_')[1];

带来好运,给我带来好运。工作好了!

但是,现在我有了一个看起来像good_luck_buddy的类。我如何让我的javascript忽略第二个_,给我luck_buddy?

我找到了var field = element。Split (new char [] {'_'}, 2);在c# stackoverflow中回答,但它不起作用。我尝试在jsFiddle…


当前回答

你也可以使用非贪婪匹配,它只是一个简单的行:

A = "good_luck_buddy" Const [,g,b] = a.match(/(.*?)_(.*)/) console.log (g,“也”,b)

其他回答

你需要正则表达式和数组做什么?

myString = myString.substring(myString.indexOf('_')+1)

你好! 我的弦=我的弦。 控制台日志(myString)。

一个简单的es6一条语句解决方案来获得第一个键和其余部分

let raw = 'good_luck_buddy'

raw.split('_')
   .reduce((p, c, i) => i === 0 ? [c] : [p[0], [...p.slice(1), c].join('_')], [])

这里有一个RegExp可以完成这个任务。

'good_luck_buddy' . split(/^.*?_/)[1] 

首先,它迫使比赛从 从“^”开始。然后它匹配任何数字 换句话说,不是'_'的字符 所有字符在第一个“_”之前。

“?'表示最小字符数 使整个模式匹配的是 由'.*?“因为它是被遵循的 通过'_',然后包含在匹配中 作为最后一个角色。

因此split()使用这样的匹配 部分作为它的“分配器”,并将其从 结果。所以它删除了所有东西 直到并包括第一个“_”和 剩下的作为第二元素 结果。第一个元素是“”表示 匹配部分之前的部分。它是 “因为比赛从头开始。”

还有其他regexp作为 很像Chandu给出的/_(.*)/ 在之前的回答中。

/ ^ * ?_/对你有好处 能理解它没有什么吗 必须了解这个特殊角色 使用replace()捕获组。

我需要字符串的两个部分,所以,regex lookbehind帮助我这个。

const full_name = 'Maria do Bairro'; Const [first_name, last_name] = full_name.split(/(?<=^[^]+) /); console.log (first_name); console.log (last_name);

Non-regex解决方案

我运行了一些基准测试,这个解决方案获得了巨大的成功

str.slice(str.indexOf(delim) + delim.length)

// as function
function gobbleStart(str, delim) {
    return str.slice(str.indexOf(delim) + delim.length);
}

// as polyfill
String.prototype.gobbleStart = function(delim) {
    return this.slice(this.indexOf(delim) + delim.length);
};

与其他解决方案的性能比较

唯一接近的竞争者是同一行代码,除了使用substr而不是slice。

我尝试的其他解决方案,包括拆分或regexp,性能受到了很大的影响,大约慢了2个数量级。当然,在拆分结果上使用join会增加额外的性能损失。

为什么它们变慢了?每当需要创建一个新对象或数组时,JS都必须向操作系统请求一大块内存。这个过程非常缓慢。

以下是一些通用指南,以防你在追逐基准测试:

为对象{}或数组[]分配新的动态内存(就像split所创建的那样)将在性能上付出很大的代价。 RegExp搜索更复杂,因此比字符串搜索慢。 如果你已经有一个数组,解构数组和显式索引数组一样快,而且看起来很棒。

从第一个实例移除

下面是一个解决方案,它将分割到并包括第n个实例。它没有那么快,但在OP的问题上,gobble(element, '_', 1)仍然比RegExp或split解决方案快>2倍,并且可以做更多:

/*
`gobble`, given a positive, non-zero `limit`, deletes
characters from the beginning of `haystack` until `needle` has
been encountered and deleted `limit` times or no more instances
of `needle` exist; then it returns what remains. If `limit` is
zero or negative, delete from the beginning only until `-(limit)`
occurrences or less of `needle` remain.
*/
function gobble(haystack, needle, limit = 0) {
  let remain = limit;
  if (limit <= 0) { // set remain to count of delim - num to leave
    let i = 0;
    while (i < haystack.length) {
      const found = haystack.indexOf(needle, i);
      if (found === -1) {
        break;
      }
      remain++;
      i = found + needle.length;
    }
  }

  let i = 0;
  while (remain > 0) {
    const found = haystack.indexOf(needle, i);
    if (found === -1) {
      break;
    }
    remain--;
    i = found + needle.length;
  }
  return haystack.slice(i);
}

根据上面的定义,gobble('path/to/file.txt', '/')将给出文件的名称,而gobble('prefix_category_item', '_', 1)将像这个答案中的第一个解决方案一样删除前缀。


测试在macOSX 10.14上的Chrome 70.0.3538.110中运行。