2015-09-24 83 views
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 

如何解决?请帮忙吗? :-(

+0

这里有一个可能的解决方案: 创建一个for循环从0开始到字符串的长度 - 1,使包含一个临时数组每个字符的指数都有一个你所关心的分隔符。 (@,/,'等等) 然后使用另一个for循环来创建一个新数组,其中初始字符串的子字符串的参数基于您创建的此temp数组中的索引。 希望这会有所帮助。 –

+0

我在我的答案中发布了一个jsfiddle,它使用正则表达式,但是我会说解析它就像@ShailendraSharma的答案可能更好更安全 – x4rf41

+0

如何通过空格分割字符串并替换删除“ ''从分割结果数组的每个项目。 – guptakvgaurav

回答

1

您可以使用正则表达式

/([\/#]\w+|'[\s\w]+')/g 

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

  1. [\/#@]\w+:这将匹配以#/@
  2. |启动串:OR条件
  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);

+0

@user呢? – Eusthace

+0

我喜欢你的答案,但我的疑问是,如果一个正则表达式是安全的?它会一直工作吗? – Eusthace

+0

@Eusthace是的,但输入字符串的格式应该是相同的,这个正则表达式仅适用于问题 – Tushar

0

这一个适用于你的情况,但与分裂:

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

注意:您还是要修剪单引号

这里就是一个例子! http://jsfiddle.net/k8s8r77e/1/

,但我不能告诉你,如果它总是工作。解析以这种方式是不是真的有什么正则表达式是。

2

这里不至REGx解决

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" ] 
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保留#。反正你有2种选择:

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); 
+0

是的,这是真的,但我想以这种方式来分割。:-( – Eusthace

+0

那么,就拆分然后更换(=删除)的报价。 – Meir

+0

是:-)但是你认为一个正则表达式是安全的? – Eusthace