NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nahrazení "zástupných znaků" v řetězci načítaném z *.txt

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Rostislav Bartoň:26. ledna 10:49

Ahoj. Jsem začátečník. Potřeboval bych v řetězci načítaném ze souboru *.txt nahradit "zástupný znak" určitou proměnnou. Konkrétně, jedná se o změnu koncovky přídavných jmen a sloves v závislosti na pohlaví:

If MZ = "žena" Then
    Kp = "á" 'koncovka přídavného jména
    Ks = "a" 'koncovka slovesa
End If

If MZ = "muž" Then
    Kp = "ý" 'koncovka přídavného jména
    Ks = "" 'koncovka slovesa
End If

při přečtení souboru:

Using sr As New StreamReader("Test.txt")
    While Not sr.EndOfStream
        Test_txt = sr.ReadLine()
    End While
End Using

Zkusil jsem: Zatím to dělám takto, mám to zapsané přímo v kódu. Příklad:

Test_txt = "Právě jsem se pokusil" & Ks & "  o něco a jsem z toho zmaten" & Ks & " a nevím co s tím"
Console.WriteLine(Test_txt)

Chci docílit: Potřeboval bych pracovat s rozsáhlými texty a proto bych raději text načítal ze souboru.

Věřím, že dotaz není moc zmatený :)

 
Odpovědět
26. ledna 10:49
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Rostislav Bartoň
Peter Mlich:27. ledna 16:16

google = csharp text replace
https://www.geeksforgeeks.org/…lace-method/

string original = "Hello, World!";
       string modified = original.Replace("World", "Geeks");
       Console.WriteLine("" + modified);

Ja bych to resil mozna tak, ze mam v textu znacku s predvyplnenym textem. A hledal reg. vyrazem znacky a obsah mezi nimi

str = "Právě jsem se pokusil/pokusila o něco a jsem z toho zmateny/zmatena a nevím co s tím"
str = "Právě jsem se {pokusil/pokusila} o něco a jsem z toho {zmateny/zmatena} a nevím co s tím"

pak... google = csharp preg replace -> csharp preg replace pattern tag
https://stackoverflow.com/…s-in-c-sharp
Pozor, ted to plodim z hlavy, CSHARP vubec nepouzivam, takze si presnejsi zapis paternu dohledej v dokumentaci

if (muz)
  Regex rgx = new Regex("{.*?/(.*)?}");
else
  Regex rgx = new Regex("{(.*)?)/.*?}");
message = Regex.Replace(message, rgx, "$1");

cely ten text v regexp se jmenuje patern, vzor (struktura textu, kterou chces najit)
{}/ jsou znaky z textu {pokusil/pokusila} je mozne, ze bude nutne pred ne pridat zpetne lomitko \, "\{(.*)?)\/.*?\}"
.* jakykoliv znak (.) opakuj 0 az nekonecno
() oznacuji vybranou cast pro subpatern (vysvetlim pozdeji)
.*?znak_nebo_pattern - opakuj jakykoliv znak dokud nenarazis na znak nebo patern

Melo by to fungovat tak, ze

  • najde prvni znak {
  • pak hleda jakykoliv znak (.), dokud nenarazi na znak za ?, cili lomitko /
  • pak hleda opet jakykoliv znak, dokud nenarazi na }
  • a zavorkami volis, kterou cast pouzije jako subpatern, ta se pak ulozi do $1
  • takze by to melo vzit celou tu cast {pokusil/pokusila} a nahradit ji zavorkami oznacenou casti

Bohuzel nevim, zda se to takto v C# da zapsat. A jestli tam funguje zapis "$1" jako v jinych jazycich :) A zda to bude probihat do konce radku nebo ne.

message = Regex.Replace(message, "{(pokusil)/pokusila}", "$1"); // cili, kdybys to napsal takto,
// tak to bude jenom muzsky rod pro konkretni zavorku se slovem. to moje by melo braz cokoliv, {slovoA/slovoB}
 
Nahoru Odpovědět
27. ledna 16:16
Avatar
Odpovídá na Peter Mlich
Rostislav Bartoň:27. ledna 19:33

Ahoj, moc Ti děkuji Peter. To cos mi napsal určitě vyzkouším.
Prozatím jsem to vyřešil možná trochu zvláštně, ale je to zatím 100% funkční:

Sub Vypis(Text As String)
    Dim Text_1 As String = Text.Replace("@", Kp)                    ' @ nahradí za koncovku přídavného jména
    Dim Text_2 As String = Text_1.Replace("#", Ks)                  ' % nahradí za koncovku slovesa
    Dim Text_3 As String = Text_2.Replace("%", Jmeno)               ' # nahradí za jméno
    Dim Pocet As Integer = Len(Text_3)
    For i = 0 To Pocet - 1
        Call Pauza(t)
        Console.Write(Text_3(i))
    Next
End Sub

Navíc jsem chtěl, aby se text vypisoval "zpomaleně" :)

Ještě jednou moc díky za ochotu a za dobrý námět ke studiu. Rosťa

 
Nahoru Odpovědět
27. ledna 19:33
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. ledna 7:43

https://learn.microsoft.com/…ring.replace?…

s = s.Replace('a', 'b').Replace('b', 'c').Replace('c', 'd');
 
Nahoru Odpovědět
30. ledna 7:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.