2015-04-03 124 views
0

我需要在第二次出現(「 - 」)之前進行拆分字符串。D:從字符的第二個出現處拆分字符串

例子:s1-qwe-123

需要得到:s1-qwe

什麼是最好的做法是什麼?

恩,謝謝,但面臨的情況下,一些文件的結構如: s1-123。我需要從他們那裏得到:s1

有沒有什麼辦法可以讓分離過程變種這種情況?

回答

2

你可以把它分解,並再次一起加入。

string line = "s1-qwe-123"; 
string interestedBit = line.split("-")[0..2].join("-"); 

還是一個遍歷字符:

int idx; 
bool found; 
string line = "s1-qwe-123"; 
for(idx = 0; idx < line.length; ++idx){ 
    if(line[idx] == '-') 
     if(found) 
      break; 
     else 
      found = true; 
} 
auto interestedBit = line[0..idx]; 
0

有很多方法可以做到這一點,我會介紹兩種。

第一是由整個字符串分割「 - 」,然後加入了前兩個元素:

import std.stdio, std.string; 
"s1-qwe-123".split("-")[0 .. 2] 
      .join("-") 
      .writeln; // -> "s1-qwe" 

這很簡單,但可能還不夠有效,因爲整個字符串必須讀。我建議的另一種方法是使用正則表達式,因爲有一個matchFirst函數只讀取第一次出現的表達式。

import std.stdio, std.regex; 
"s1-qwe-123".matchFirst("[^-]+-[^-]+")[0] 
      .writeln; // -> "s1-qwe" 

如果你希望它是真的你可以使用一個編譯時的正則表達式:

import std.stdio, std.regex; 
"s1-qwe-123".matchFirst(ctRegex!("[^-]+-[^-]+"))[0] 
      .writeln; // -> "s1-qwe" 
2

我原來的答案是完全錯誤的,因爲我誤解了問題。下面是提供有關split解決方案略有變化的正確答案在其他的答案已經建議:

import std.algorithm : splitter; 
import std.array : join; 
import std.range : take; 
auto res = "s1-qwe-123".splitter("-").take(2).join('-'); 
assert(res == "s1-qwe"); 

使用splitter的優勢split是懶惰的評價。這應該只是走到第二個' - ',而不是進一步。

+0

對不起,我的意思是什麼顯示在一個例子。 – Suliman 2015-04-03 18:34:10

+0

糟糕,它看起來像我的anwser反正是錯誤的。對於那個很抱歉。 – rcorre 2015-04-03 20:38:34

4
int saw; 
auto s = "s1-qwe-123".findSplitBefore!(c => c == '-' && saw++ > 0)[0]; 
+0

不錯的使用後增量!我試圖想出一個很好的方法來做到這一點,但只是採取了一個循環。非常好! – 2015-04-04 18:59:54