2015-06-03 22 views
12

比方說,我有一個字符串:"We.need..to...split.asap"。我想要做的是按定界符.分割字符串,但我只希望分割第一個.,並在後續令牌中包含任何反覆出現的.如何通過不直接在同一類型的字符之前的字符來分割字符串?

預期輸出:

["We", "need", ".to", "..split", "asap"] 

在其他語言中,我知道這是可能的一個向後看/(?<!\.)\./但使用Javascript遺憾的是不支持這樣的功能。

我很好奇看到你對這個問題的答案。也許有一種巧妙利用現在迴避我的前瞻?

我正在考慮扭轉字符串,然後再倒車令牌,但似乎有太多的工作是什麼,我以後...加上爭議:How do you reverse a string in place in JavaScript?

感謝您的幫助!

+1

' 「We.need..to ...... split.asap」 .split(/ \ B \ ./)',但這隻適用於如果第一個'.'由字字符開頭。 – nhahtdh

回答

5

下面是處理兩個以上的連續的分隔符的the answer by guest271314的變化:

var text = "We.need.to...split.asap"; 
var re = /(\.*[^.]+)\./; 
var items = text.split(re).filter(function(val) { return val.length > 0; }); 

它使用細節,如果分裂表達包括捕獲基團,捕獲的項目包含在返回的數組中。這些捕獲組實際上是我們感興趣的唯一事物;這些標記都是空字符串,我們將其過濾掉。

編輯:不幸的是,這可能有一個小小的錯誤。如果要分割的文本以分隔符開始,那將包含在第一個標記中。

var re = /(?:^|(\.*[^.]+))\./; 
var items = text.split(re).filter(function(val) { return !!val; }); 

(我認爲這正則表達式是醜陋和歡迎的改進。)

2

注意:這個答案不能處理超過2個連續的分隔符,因爲它是根據the revision 1 of the question中的例子編寫的,這個例子不是很清楚這種情況。


var text = "We.need.to..split.asap"; 
 
// split "." if followed by "." 
 
var res = text.split(/\.(?=\.)/).map(function(val, key) { 
 
    // if `val[0]` does not begin with "." split "." 
 
    // else split "." if not followed by "." 
 
    return val[0] !== "." ? val.split(/\./) : val.split(/\.(?!.*\.)/) 
 
}); 
 
// concat arrays `res[0]` , `res[1]` 
 
res = res[0].concat(res[1]); 
 

 
document.write(JSON.stringify(res));

+0

它很聰明,但不能處理超過2個連續的分隔符。例如:「we.need.to ... split.asap」。不過,我會對它進行投票,因爲這在問題的例子中並不明確。 – DRAB

+3

@DRAB也許包含_「處理任何超過2個連續的分隔符,例如:」we.need.to ... split.asap「」_「,因爲在問題示例中沒有特別清楚。 – guest271314

+3

OP使用複數暗示了兩個以上的分隔符:「任何經常出現的」.s「。 –

3

你可以做到這一點沒有任何向前看符號:

var subject = "We.need.to....split.asap"; 
 
var regex = /\.?(\.*[^.]+)/g; 
 

 
var matches, output = []; 
 

 
while(matches = regex.exec(subject)) { 
 
    output.push(matches[1]); 
 
} 
 

 
document.write(JSON.stringify(output));
如果這是一個問題,它可以與補救

這似乎是它會在同一行的工作,因爲它沒有在https://regex101.com/r/cO1dP3/1,卻不得不在代碼中擴大因爲默認情況下/g選項會阻止捕獲組返回.match(即,正確的數據在捕獲組中,但是我們不能立即訪問它們而沒有執行上述操作)。

請參見:JavaScript Regex Global Match Groups

與原來的襯墊(加一行)另一種解決方案是:

document.write(JSON.stringify(
 
    "We.need.to....split.asap".match(/\.?(\.*[^.]+)/g) 
 
     .map(function(s) { return s.replace(/^\./, ''); }) 
 
));

任你選!

+0

這ISN OP需要的是哪些,其中包括**除了每個令牌中的前一個分隔符之外的所有**。 (換句話說,結果應該是'[「我們」,「需要」,「到」,「... split」,「asap」]'。 –

+0

我知道,從Regex101移動正則表達式時出現問題.com到這裏。應該現在工作,但不再是1行:( –

+0

好得多。+1 –

相關問題