2015-04-03 3 views
0

Мне нужно выполнить разделение строки перед вторым вхождением («-»).D: Разделить строку из второго вхождения символа

Пример: s1-qwe-123

нужно получить: s1-qwe

Что такое лучшая практика?

Ehm, спасибо, но столкнулся с ситуацией, когда некоторые файлы имеют структуру вроде: 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

+0

Увы, похоже, что мой anwser ошибся. Извини за это. – rcorre

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

Хорошее использование пост-приращения! Я пытался придумать хороший способ сделать это, но просто прибег к циклу. Очень хорошо! –

Смежные вопросы