Это работает в Bash и Korn, также может идти от более высоких к более низким числам. Наверное, не самый быстрый или красивый, но работает достаточно хорошо. Также обрабатывает негативы.
function num_range {
# Return a range of whole numbers from beginning value to ending value.
# >>> num_range start end
# start: Whole number to start with.
# end: Whole number to end with.
typeset s e v
s=${1}
e=${2}
if (( ${e} >= ${s} )); then
v=${s}
while (( ${v} <= ${e} )); do
echo ${v}
((v=v+1))
done
elif (( ${e} < ${s} )); then
v=${s}
while (( ${v} >= ${e} )); do
echo ${v}
((v=v-1))
done
fi
}
function test_num_range {
num_range 1 3 | egrep "1|2|3" | assert_lc 3
num_range 1 3 | head -1 | assert_eq 1
num_range -1 1 | head -1 | assert_eq "-1"
num_range 3 1 | egrep "1|2|3" | assert_lc 3
num_range 3 1 | head -1 | assert_eq 3
num_range 1 -1 | tail -1 | assert_eq "-1"
}
string.Split и TakeWhile могут вам помочь
var resultArray = str.Split(new []{@"/"},StringSplitOptions.RemoveEmptyEntries)
.TakeWhile(x=>!x.Equals("distributions"));
Вывод
<root>
win
<usr>
Обновление на основе комментариев
Если вам нужно Весь путь, основанный до «распределения», можно использовать
var result = str.Split(new []{@"distributions"},StringSplitOptions.RemoveEmptyEntries)
.First();
Вывод
/<root>/win/<usr>/
В чем проблема старого доброго пути?
var s = "/<root>/win/<usr>/distributions/<dbms>/<repository>/<port.....";
var result = s.Substring(0, s.IndexOf("distributions"));
или s.Substring(0, s.IndexOf("/distributions/")+1)
, если этот текст может появиться и в другой форме ...
Предполагая, что вы действительно хотите получить путь до этой точки, я бы порекомендовал использовать здесь регулярные выражения, вот как я бы это сделал.
Regex regex = new Regex(@".+?(?=distributions)");
Debug.WriteLine(regex.Match("/<root>/win/<usr>/distributions/<dbms>/<repository>").Value);
это выводит /<root>/win/<usr>/
string.split ('/') помещает каждый «компонент» пути (или любую строку) в массив, разделяя их по разделителю (/ здесь). Вы могли бы затем пройти через это.