基于多个分隔符 [/, #, @, ''] 分割字符串

4

我想根据多个分隔符拆分字符串。

如何使用多个字符串作为分隔符拆分字符串?

例如:

我有一个字符串:"/create #channel 'name' 'description of the channel' #field1 #field2"

我想获得一个数组:

/create
#channel
name
description of the channel
#field1
#field2

另一个例子,我有以下代码:"/send @user 'A messsage'" 我想要的是:

/send
@user
A message

如何解决?有什么帮助吗? :-(

以下是可能的解决方案:创建一个 for 循环,从 0 开始到字符串长度 - 1,以创建一个临时数组,其中包含每个具有你关心的分隔符(@、/、' 等)的字符的索引。然后使用另一个 for 循环,根据你创建的临时数组中的索引,创建一个新的子字符串数组,其参数基于初始字符串。希望这可以帮助到你。 - Kabir Peshawaria
我在我的答案中发布了一个使用正则表达式完成的JSFiddle,但我认为像@ShailendraSharma的答案中那样解析它可能更好,更安全。 - x4rf41
将字符串按空格分割,然后替换每个拆分结果数组中的每个项中出现的 ' - Gaurav Gupta
@GauravGupta 那对于像 'description of the channel' 这样的字符串是行不通的。 - Tushar
@Tushar 没错,我完全忽略了那个。 - Gaurav Gupta
5个回答

3

这里提供不使用正则表达式的解决方案。

var multiSplit = function (str, delimeters) {
    var result = [str];
    if (typeof (delimeters) == 'string')
        delimeters = [delimeters];
    while (delimeters.length > 0) {
        for (var i = 0; i < result.length; i++) {
            var tempSplit = result[i].split(delimeters[0]);
            result = result.slice(0, i).concat(tempSplit).concat(result.slice(i + 1));
        }
        delimeters.shift();
    }
    return result;
}

只需使用

multiSplit("/create #channel 'name' 'description of the channel' #field1 #field2",['/','#','@',"'"])

输出

Array [ "", "create ", "channel ", "name", " ", "description of the channel", " ", "field1 ", "field2" ]

2
你可以使用正则表达式。
/([\/#]\w+|'[\s\w]+')/g

关于正则表达式的解释:https://regex101.com/r/lE4rJ7/3

  1. [\/#@]\w+:这将匹配以#/@开头的字符串。
  2. |:或条件
  3. '[\s\w]+':匹配用引号括起来的字符串。

由于正则表达式也会匹配引号,因此需要将它们删除。

var regex = /([\/#@]\w+|'[\s\w]+')/g;

function splitString(str) {
  return str.match(regex).join().replace(/'/g, '').split(',');
}

var str1 = "/create #channel 'name' 'description of the channel' #field1 #field2 @Tushar";
var str2 = "/send @user 'A messsage'";

var res1 = splitString(str1);
var res2 = splitString(str2);

console.log(res1);
console.log(res2);

document.write(res1);
document.write('<br /><br />' + res2);


@user是什么情况? - Eusthace
我喜欢你的回答,但我的疑问是正则表达式是否安全?它总是有效吗? - Eusthace
@Eusthace 是的,但输入字符串的格式应该相同,这个正则表达式只适用于问题中的两种情况。 - Tushar
1
我喜欢它,它很简单。谢谢! - Eusthace
@Eusthace 一个简单的方法是在使用正则表达式之前将所有的 " 替换为 ' - Tushar

0

这个适用于你的情况,但不适用于分割:

('[^']+'|[^\s']+)

注意:你仍然需要去掉单引号!

这里有一个例子:http://jsfiddle.net/k8s8r77e/1/

但我不能保证它总是有效。使用正则表达式进行解析并不是它的真正用途。


0

可能有类似这样的解决方案..不过需要进行调整以避免清除撇号

var w = "/create #channel 'name' 'description of the channel' #field1 #field2";

var ar = w.split();

ar.forEach(function(e, i){  
    e = e.replace(/'/g, '')
    console.log(e)
})

代码片段: http://jsfiddle.net/d9m9o6ao/


0

在您提供的示例中存在一些不一致之处,您要么按这些字段拆分,要么将它们作为字段标记,但您似乎混合使用了这两种方法。以您的第一个示例为例,在原始字符串中,您有“name”,但在结果中,您将其剥离了“'”并仅保留了名称,而“#channel”则保留了“#”。无论如何,您有两个选项:

String.split采用正则表达式,因此您可以使用:

var re = /['\/@#"]+\s*['\/@#"]*/;

var str = "/create #channel 'name' 'description of the channel' #field1 #field2";
var parts = str.split(re);

您获得了一组令牌。请注意,在这种情况下,第一个令牌为空,使用parts数组之前请删除空字符串。

或者,使用正则表达式的string.match函数:

var re = /['\/@#"][^'\/@#"]*/g;
var parts = str.match(re);

是的,这是真的,但我想以那种方式拆分。 :-( - Eusthace
好的,只需分割然后替换(=删除)引号即可。 - Meir
是的, :-) 但是你认为正则表达式安全吗? - Eusthace
好的,我已经对其进行了消毒,并确保它来自一个好的供应商;-) 说真的,你所说的安全是什么意思? - Meir
它应该在你描述的所有情况下都能正常工作。如果您可以描述您的格式,即什么是分隔符以及应该删除什么,那么您可以编写代码。 - Meir

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