Javascript: 用this|that进行分割

6
如何拆分这样的字符串
var str = "M50 0 L0 100 L100 100 L50 0 z M0 0 L100 0 L50  100 L0 0 Z";

var arr4String = str.split('z|Z');

我期望得到一个包含3个元素的数组:
["M50 0 L0 100 L100 100 L50 0", "M0 0 L100 0 L50  100 L0 0", ""]
6个回答

3

如果您想按照正则表达式进行拆分,需要将正则表达式作为参数传递给split函数:

var str = "M50 0 L0 100 L100 100 L50 0 z M0 0 L100 0 L50  100 L0 0 Z";

var arr4String = str.split(/z|Z/);
                           ^   ^

生成:

["M50 0 L0 100 L100 100 L50 0 ", " M0 0 L100 0 L50  100 L0 0 ", ""]
                             ^    ^                         ^

(请注意额外的空格,因为正则表达式不会删除这些空格。)

如果您想要修剪结果,可以使用以下方法:

...split(/\s*z\s*/i);

或者你可以直接链接调用它:
...split(/z/i).map(function (val) {
    return val.trim();
});

你将得到的输出不是 OP 想要的。 - Wiktor Stribiżew
1
@WiktorStribiżew,它完美地运行了,OP只是错过了空格。如果您想要删除空格以及拆分,则只需使用maptrim调用即可。 - zzzzBov
可以使用正则表达式更加优雅地完成。OP没有忘记空格。 - Wiktor Stribiżew
@WiktorStribiżew,当然,这可以简单地完成,但诀窍在于不要过于简化。使用正则表达式尝试做太多事情并且当事情开始出错时陷入困境是非常容易的,而大多数情况下,几个简单的函数调用将实现相同的结果并使代码更易于理解。 - zzzzBov
谢谢您的时间。 - thednp

3
使用正则表达式。使用g标志表示从开头到结尾搜索整个字符串,这样它就不会在第一次遇到z|Z时停止。i标志使搜索不区分大小写。
  var str = "M50 0 L0 100 L100 100 L50 0 z M0 0 L100 0 L50  100 L0 0 Z";

  var arr4String = str.split(/z/gi);

这看起来很可靠,对我有用。我会检查一下 :) - thednp
2
你不需要使用/g - split函数默认就会使用全局匹配。 - Wiktor Stribiżew

1
这里,你可以使用/\s*z\s*/i正则表达式进行分割:

var str = "M50 0 L0 100 L100 100 L50 0 z M0 0 L100 0 L50  100 L0 0 Z";
var arr4String = str.split(/\s*z\s*/i);
document.body.innerHTML = "<pre>" + JSON.stringify(arr4String,0,4) + "</pre>";

/\s*z\s*/i 正则表达式将匹配 z 前后的零个或多个空格(由于使用了 /i 修饰符,因此执行不区分大小写的搜索)。

这对我的需求来说有些过于强大了。 str.split(/z/gi) 就可以了,但感谢您的及时回复和解释。 - thednp
你不需要使用/g - split函数的默认行为已经包含了它。 - Wiktor Stribiżew
2
那甚至更可爱 :) - thednp

1
var arr4String = str.replace('z','Z').split('Z');

这看起来也不错 :) - thednp

0

你很接近了,但你需要一个正则表达式而不是一个字符串,你可以使用斜杠而不是引号来实现 (/z|Z/)。

然而,仅仅使用这个还不能得到你想要的结果。你实际上想要一个正则表达式,它可以去除你的“z”字符周围的空格。此外,假设你传入一个包含"L100z200"的字符串,你也不希望它在中间分裂。为了实现这一点,你可以使用\b来确保有一个单词边界。下面是代码:

var str = "M50 0 L0 100 L100 100 L50 0 z M0 0 L100 0 L50  100 L0 0 Z";

var arr4String = str.split(/\b\s*z\s*\b/i);
console.log(arr4String);
// Exactly:
// ["M50 0 L0 100 L100 100 L50 0", "M0 0 L100 0 L50  100 L0 0", ""]

1
谢谢,但我觉得正则表达式有点过于复杂了。 - thednp
@thednp 这没问题,但这样会让你容易出现漏洞,并且无法得到你所要求的精确结果 :) - rgthree

0

仅为完整性考虑(可能比 /z/i 更快):

var arr4String = str.split(/[zZ]/);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接