我需要在第二次出现之前拆分字符串(" - ")。
示例:s1-qwe-123
需要获得:s1-qwe
最佳做法是什么?
嗯,谢谢,但面对的情况是某些文件的结构如下:s1-123
。我需要从他们那里得到:s1
。
有没有办法在拆分过程中使用这种情况制作变体?
答案 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"