Dzielienie stringa na podstawie znaków i ich kolejności

0

Witam. Mój problem jest następujący, potrzebuję zamienić taki ciąg znaków:
"A.B1.11" ---> "A\B\C\1.11\C-1.11.jar"
Przy czym ciągi mogą mieć różną długość np.
"A.B.E.F1.11" ---> "A\B\E\F\C\1.11\C-1.11.jar"

Nie mam pojęcia jak się za to zabrać... Próbowałem różnych rzeczy i nic nie działa w taki sposób jaki potrzebuję.
Próbowałem użyć np.

S.Replace(".", "\");

Jednak w ten sposób mogę tylko zamienić znaki w stringu, próbowałem też dzielić stringa na kawałki typu "A", "B", "C" i coś z nimi robić itd. Wszystko bez skutku.

Trzeba jakoś rozpoznawać, że kropki, które znajdują się przed ":" mają zamienić się na znak "", a to co jest przed ":" ma też zamienić się na "", ale nazwa, która znajduje się po nim ma być użyta dwa razy (więc wyraz ten trzeba wydzielić do osobnego stringa. Natomiast ostatnia kropka zawsze ma zostać niezmieniona. Chyba nie zaplątałem za bardzo ;)

Ma ktoś jakiś pomysł jak to zrobić ? Ja siedzę nad tym kilka godzin i już na prawdę nie mam pomysłów...
Proszę Was o pomoc ;)
Pozdrawiam.

EDIT:

char[] myChars = { '.' };
            string[] words = mystring.Split(myChars);

            foreach (string s in words)
            {
                System.Console.WriteLine(s);
            }

Taki kod podzieli tekst na postawie ".", jednak musiałby skończyć to robić po trafieniu na ":", jak tego dokonać ?
Później można zrobić to samo z ":".

1

Nie wiem czy dobrze zrozumiałem ale czy w tym zamienianym ciagu znaków cyfry występują tylko na końcu? Możesz sobie zapisać ten ciąg do tablicy i później odczytywać te znaki if znak jest równy coś to zamień na coś2.

0

Zazwyczaj, jednak czasami występują w nazwach. Te ciągi znaków wyglądają tak:

net.minecraft1.11
org.ow2.asm:asm-all:5.0.3
com.typesafe.akka:akka-actor_2.11:2.3.3

I z tego mają powstać stringi typu:
"\net\minecraft\launchwrapper\1.11\launchwrapper-1.11.jar"
"\org\ow2\asm\asm-all\5.0.3\asm-all-5.0.3.jar"
itd.
EDIT:
Co do twojego pomysłu:
Chodzi ci o coś takiego ?

string[] array = new string[] { mojstringzciagiemznakow };

I co mam z tym zrobić ? Mogę wrzucić w foreach, ale w ten sposób wydobędę cały ciąg, ew. mogę dodać do tablicy pojedyncze wyrazy, ale robiąc to poprzednim sposobem całkowicie tracę informacje o tym co między czym stało :/

1

Nie mam do końca koncepcji, ale możesz spróbować zrobić to tak, że podzielisz sobie ten ciąg w taki sposób

string[] tab = ciag.Split(':');

teraz możesz sprawdzać poszczególne ciągi pod kontem czy są to nazwy plików czy katalogi. Według tego kryterium możesz użyć funkcji replace tak jak chcesz, żeby został zmieniony dany ciąg.

0

Zrobiłem coś takiego:

string[] tab = lib.Split(':');
            string dir = null;
            string all = null;
            bool i = true;
            foreach(string s in tab)
            {
                //first is dir
                if (i)
                {
                    dir = s.Replace('.', '\\');
                    i = false;
                    all = dir;
                }
                else
                {
                    all += "\\" + s;                                
                }
                Console.WriteLine(all);
            }

Zwraca: "net\minecraft\launchwrapper\1.11" z "net.minecraft1.11"
a powinno: "net\minecraft\launchwrapper\1.11\launchwrapper-1.11.jar"

Mógłbym to rozwiązać kilkoma intami, ale wtedy działać będzie tylko wtedy kiedy liczba wyrazów będzie się idealnie zgadzać...

0

Udało się! ;) Serdeczne dzięki!
Wystarczyło zrobić drugą pętle foreach dla drugiego członu ciągu, i to ogarnąć w analogiczny sposób :D .

1

@Zdziwiony, ale po co jakieś pętle i ify?

static string BuildPath(string input)
{
    int firstColonIndex = input.IndexOf(':');
    int secondColonIndex = input.IndexOf(':', firstColonIndex + 1);
    string rawFileName = input.Substring(firstColonIndex + 1);
    string dirPath = input.Substring(0, secondColonIndex).Replace('.', '\\').Replace(':', '\\');
    string fileName = rawFileName.Replace(':', '-');
    string version = input.Substring(secondColonIndex + 1);

    return string.Format("\\{0}\\{1}\\{2}.jar", dirPath, version, fileName);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1