我需要在第二次出現(「 - 」)之前進行拆分字符串。D:從字符的第二個出現處拆分字符串
例子:s1-qwe-123
需要得到:s1-qwe
什麼是最好的做法是什麼?
恩,謝謝,但面臨的情況下,一些文件的結構如: s1-123
。我需要從他們那裏得到:s1
。
有沒有什麼辦法可以讓分離過程變種這種情況?
我需要在第二次出現(「 - 」)之前進行拆分字符串。D:從字符的第二個出現處拆分字符串
例子:s1-qwe-123
需要得到:s1-qwe
什麼是最好的做法是什麼?
恩,謝謝,但面臨的情況下,一些文件的結構如: s1-123
。我需要從他們那裏得到:s1
。
有沒有什麼辦法可以讓分離過程變種這種情況?
你可以把它分解,並再次一起加入。
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];
有很多方法可以做到這一點,我會介紹兩種。
第一是由整個字符串分割「 - 」,然後加入了前兩個元素:
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"
我原來的答案是完全錯誤的,因爲我誤解了問題。下面是提供有關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
是懶惰的評價。這應該只是走到第二個' - ',而不是進一步。
int saw;
auto s = "s1-qwe-123".findSplitBefore!(c => c == '-' && saw++ > 0)[0];
不錯的使用後增量!我試圖想出一個很好的方法來做到這一點,但只是採取了一個循環。非常好! – 2015-04-04 18:59:54
對不起,我的意思是什麼顯示在一個例子。 – Suliman 2015-04-03 18:34:10
糟糕,它看起來像我的anwser反正是錯誤的。對於那個很抱歉。 – rcorre 2015-04-03 20:38:34