如何在 JavaScript 中使用多个分隔符拆分字符串?

IT技术 javascript regex split
2021-01-22 08:29:03

如何在 JavaScript 中使用多个分隔符拆分字符串?

我试图在逗号空格上进行拆分,但 AFAIK JavaScript 的split()函数仅支持一个分隔符。

6个回答

传入一个正则表达式作为参数:

js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!

编辑添加:

您可以通过选择数组的长度减 1 来获取最后一个元素:

>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

...如果模式不匹配:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
你的 js> 控制台用的是什么?
2021-03-10 08:29:03
如何拆分字符串“hello world”以及另一个字符(或其他正则表达式),例如管道符号?尝试了(hello world)|\|其中的变体还不太奏效。有任何想法吗?
2021-03-20 08:29:03
谢谢。与此相关的另一个问题我需要做的是获取拆分数组的最后一个元素。如果没有数组,它应该返回字符串 thx
2021-03-29 08:29:03
rhino,Mozilla 在 Java 中的 JavaScript 实现:mozilla.org/rhino(...或“sudo apt-get install rhino”)。
2021-04-06 08:29:03
使用正则表达式进行拆分时,有什么方法可以避免删除分隔符?
2021-04-09 08:29:03

您可以将正则表达式传递给 JavaScript 的split()方法。例如:

"1,2 3".split(/,| /) 
["1", "2", "3"]

或者,如果您想允许多个分隔符一起仅作为一个分隔符

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(你必须使用非捕获(?:)括号,否则它会被拼接回结果中。或者你可以像 Aaron 一样聪明并使用字符类。)

在 Safari 和 Firefox 中测试的示例。

@AndersonGreen 这完全取决于你想要什么;在这种情况下,有多个分隔符,所以要保留所有分隔符吗?作为一个单独的项目?加入上一个项目?下一项?这对我来说似乎不清楚。你可能想用一些你正在寻找的例子来提出一个新问题。
2021-03-11 08:29:03
我想知道在使用正则表达式拆分字符串时是否有办法避免删除分隔符:此示例删除了分隔符,但我希望可以在不删除它们的情况下拆分字符串。
2021-03-20 08:29:03
@JesseRusak 我的意思是将所有分隔符保留为单独的项目,以便可以使用分隔符列表对字符串进行标记。
2021-03-25 08:29:03
如果您需要多个字符作为一个字符,例如“one;#two;#new jersey”,您可以简单地将字符串“;#”传递给 split 函数。"one;#two;#new jersey".split(";#")[2] === "new jersey"
2021-04-01 08:29:03
如果您需要拆分多个字符,则此方法比字符类更有效。将它们分开,|如 Jesse 所示。
2021-04-01 08:29:03

另一种简单但有效的方法是反复使用split+join。

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

从本质上讲,先拆分后连接就像全局替换一样,因此这会用逗号替换每个分隔符,然后一旦所有分隔符都被替换,它就会对逗号进行最终拆分

上述表达式的结果是:

['a', 'b', 'c', 'd']

对此进行扩展,您还可以将其放在一个函数中:

function splitMulti(str, tokens){
        var tempChar = tokens[0]; // We can use the first token as a temporary join character
        for(var i = 1; i < tokens.length; i++){
            str = str.split(tokens[i]).join(tempChar);
        }
        str = str.split(tempChar);
        return str;
}

用法:

splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]

如果您经常使用此功能,String.prototype.split为了方便起见,甚至可能值得考虑包装 (我认为我的函数相当安全 - 唯一的考虑是条件(次要)的额外开销以及它缺少 limit 参数的实现这一事实如果传递数组)。

splitMulti如果使用下面的这种方法简单地包装它,请确保包含该函数:)。还值得注意的是,有些人不赞成扩展内置插件(因为很多人做错了,可能会发生冲突)所以如果有疑问,请在使用它之前与更高级的人交谈或询问 SO :)

    var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
    String.prototype.split = function (){
        if(arguments[0].length > 0){
            if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
                return splitMulti(this, arguments[0]);  // Call splitMulti
            }
        }
        return splitOrig.apply(this, arguments); // Call original split maintaining context
    };

用法:

var a = "a=b,c:d";
    a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
        a.split('='); // ["a", "b,c:d"] 

享受!

你为什么写for(var i = 0; i < tokens.length; i++)而不是for(var i = 1; i < tokens.length; i++)
2021-03-11 08:29:03
我错过了那个优化,你是对的,我们可以开始tokens[1]保存一次迭代,tokens[0] == tempchar然后我们tempchar在迭代tokens完成分开我会相应地更新答案,谢谢@tic :)。
2021-03-22 08:29:03
玩原型是不明智的。由于在底层发生了优化,因此很难意识到开销考虑因素。您可能会在 C 中触发一个标志,表示“如果他们修改了原型,假设 X 不再安全,则回退到这个 [慢得多] 代码路径”,适用于各种函数。看起来像“低开销”的东西最终可能会使其他优化代码的执行速度减慢几个数量级。
2021-03-27 08:29:03
不好,因为如果,字符串中已经有 a ,即使你不想要它,你也会被它分开。
2021-04-04 08:29:03
@BrodaNoel 你说得对,这是第一个代码示例的一个主要警告。在这种特殊情况下,最好使用可以安全拆分的字符,在我的示例中,目的是替换 ,,因此它是“安全的”,但这当然是需要注意的。splitMulti示例通过使用数组中的第一个标记作为临时占位符来解决这个问题,因为我们知道我们希望所有这些都被替换,因此使用起来总是安全的:)
2021-04-07 08:29:03

让我们保持简单:(在您的 RegEx 中添加“[]+”意味着“1 或更多”)

这意味着“+”和“{1,}”是相同的。

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
我会说这是最小的,不简单
2021-03-12 08:29:03
对于 + 和 - :-D,还有 \s 而不是空白字符: var words = text.split(/[\s.:;?!~,`"&|()<>{}\= \+\-[]\r\n/\]+/);
2021-03-19 08:29:03
在末尾添加“+”表示 1 个或多个
2021-04-05 08:29:03

棘手的方法:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
这是错误的,因为 .replace() 不会替换所有元素 :/
2021-03-22 08:29:03
您可以更改'('/(/g替换所有(元素 -gRegExp全局标志 - 所以它搜索所有出现的(不是第一个
2021-03-25 08:29:03