D:从第二次出现的角色中拆分字符串

时间:2015-04-03 17:03:17

标签: string split d

我需要在第二次出现之前拆分字符串(" - ")。

示例:s1-qwe-123

需要获得:s1-qwe

最佳做法是什么?

嗯,谢谢,但面对的情况是某些文件的结构如下: s1-123。我需要从他们那里得到:s1

有没有办法在拆分过程中使用这种情况制作变体?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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];

答案 2 :(得分: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的优势是延迟评估。这应该只走到第二个 - &#39; - &#39;没有了。

答案 3 :(得分: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"