2015-09-24 81 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