Smazat text s listboxu ,který obsahuje slova – Visual Basic – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Smazat text s listboxu ,který obsahuje slova – Visual Basic – Fórum – Programujte.comSmazat text s listboxu ,který obsahuje slova – Visual Basic – Fórum – Programujte.com

 

krpik0
Newbie
9. 9. 2019   #1
-
0
-

Zdravím

potřebuji aplikaci která smaže věty s listboxu které začínají <!-- a končí -->

např.

<!-- komentář k podmínce

komentař pokračuje

komentař končí -- >

aplikace vyhledá a smaže tedy všechny tři řádky

můj kod co mam zatím

Dim items As New List(Of String)
        Dim nalezslovo As Boolean

        Dim A As String() = {"<!--"}
        Dim B As String() = {"-->"}

        For i As Integer = 0 To ListBox1.Items.Count - 1


            For Each slovo As String In A

(zde nevím jak dostadit aby aplikace vyhledala také znaky pod B)


                nalezslovo = False

                If ListBox1.Items(i).ToString.Contains(slovo) Then
                    nalezslovo = True
                    Exit For
                End If

            Next

            If nalezslovo = False Then items.Add(ListBox1.Items(i))

        Next


        ListBox1.Items.Clear()
        ListBox1.Items.AddRange(items.ToArray)

aplikace nyní dělá že vyhledá pouze <!-- a smaže jen první větu,potřeboval bych dosadit podmíku pro --> aby aplikace vyhledala větu začinajíci <!-- a končíci -->

Děkuji za odpovědi

Nahlásit jako SPAM
IP: 46.174.58.–
gna
~ Anonymní uživatel
1853 příspěvků
9. 9. 2019   #2
-
0
-

   

Dim items = {"AA","<!-- BB -->","CC","<!-- DD","DD","DD -->","EE"}
Dim fixed As New List(Of String)
Dim skip As Boolean = False
For Each item As String In items
    If item.StartsWith("<!--") Then skip =True
    If Not Skip Then fixed.Add(item)
    If item.EndsWith("-->") Then skip = False
Next
Dim data = "AA<!-- BB -->CC<!-- DD -->EE"
Dim fixed = Regex.Replace(data, "<!-- .*? -->", "", RegexOptions.Singleline)
Nahlásit jako SPAM
IP: 213.211.51.–
krpik0
Newbie
9. 9. 2019   #3
-
0
-

Napadlo mě na button

For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim Text As String = Convert.ToString(ListBox1.Items(i))
            Text = Regex.Replace(ListBox1.Items(i), "<!--[^\-]+-->", "")

            ListBox1.Items(i) = Text

Požit Regex ale tohle mě vymaže pouze řádek

pokud bude text

<!-- aaaaa

aaaa

aaaa --> 

tak ho už nesmaže pouze první řádek

Nahlásit jako SPAM
IP: 46.174.58.–
gna
~ Anonymní uživatel
1853 příspěvků
10. 9. 2019   #4
-
0
-

Protože každá Item je jen jeden řádek. Takže můžeš použít to procházení s pamatováním stavu, nebo to nahrazení udělej na kompletním textu. Nějak nevidím důvod proč zobrazovat soubor v listboxu.

Nahlásit jako SPAM
IP: 213.211.51.–
krpik0
Newbie
10. 9. 2019   #5
-
0
-

#4 gna
no napadlo mě že to bude lepší když si tlačítkem načtu text do listobu ,dalším tlačítkem uložím upraveny text v listoboxu a třetí tlačítko nechám na upravu textu

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim openfile = New OpenFileDialog() With {.Filter = "Text (*.php)|*.php"}
        If (openfile.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then
            For Each line As String In File.ReadAllLines(openfile.FileName)
                ListBox1.Items.Add(line)
            Next
        End If

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ' SAVE DIALOG
        Dim SaveFileDialog1 As New SaveFileDialog
        SaveFileDialog1.FileName = ""
        SaveFileDialog1.Filter = "Text Files (*.php)|*.php|All Files (*.*)|*.*"

        If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
            Dim sb As New System.Text.StringBuilder()

            For Each o As Object In ListBox1.Items
                sb.AppendLine(o)
            Next

            System.IO.File.WriteAllText(SaveFileDialog1.FileName, sb.ToString())
        End If
    End Sub

------------------------------

tak a třetí button který v listboxu smazné ty danné texty co obsahuji znaky

a bud to udělam s pomoci Regexu což ale není účinné pro více řádku

  Dim IndexInteger As Integer = ListBox1.SelectedIndex
        Dim Results =
            (
                From T In ListBox1.Items
                Select System.Text.RegularExpressions.Regex.Replace(CStr(T), "<!--(.|\s)*?-->", "")
            ).ToArray

        ListBox1.Items.Clear()
        ListBox1.Items.AddRange(Results)

        If IndexInteger <> -1 Then
            ListBox1.SelectedIndex = IndexInteger
        End If

nebo

přes indexy ale to nevím jak na to
int start = input.IndexOf("<--");

int end = input.IndexOf("-->");
 

Nahlásit jako SPAM
IP: 46.174.58.–
MilanL+1
Grafoman
10. 9. 2019   #6
-
0
-

#5 krpik
ahoj,

je třeba to ošetřit při načítání, hrubý postup:

1) nenačítat rovnou do boxu, ale nejdříve do řetězcové proměnné

2) otestovat na "<!-" nastavit si příznak začátku na ANO  (číslo nebo TRUE/FALSE)

3) otestovat příznak začátku 

  - když NE vložit do Listboxu

  - když ANO otestova na konec "-->" , po nalezení příznak začátku NE

použít pro každou načítanou položku.

lze použít i pro více požadovaných formátů vynechání.

případně lze použít i na části vět před komentářem (do listboxu od začátku po nalezený index "<!-" nebo za komentářem od index "-->" + 3 kde 3 je délka toho hledaného do konce.

funkcí je více záleží na prostředí zda je to MS OFFICE, nebo NET, existují např i hledací funkce od konce

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
10. 9. 2019   #7
-
0
-

#5 krpik
ahoj,

je třeba to ošetřit při načítání, hrubý postup:

1) nenačítat rovnou do boxu, ale nejdříve do řetězcové proměnné 

2) otestovat na "<!-" nastavit si příznak začátku na ANO  (číslo nebo TRUE/FALSE)

3) otestovat příznak začátku 

  - když NE vložit do Listboxu

  - když ANO otestova na konec "-->" , po nalezení příznak začátku NE

použít pro každou načítanou položku.

lze použít i pro více požadovaných formátů vynechání.

případně lze použít i na části vět před komentářem (do listboxu od začátku po nalezený index "<!-" nebo za komentářem od index "-->" + 3 kde 3 je délka toho hledaného do konce.

funkcí je více záleží na prostředí zda je to MS OFFICE, nebo NET, existují např i hledací funkce od konce

Pokud bys ty komentáře chtěl odstranit až na stisk tlačítka, můžeš načíst vše do LB a tu vynechávací část aplikovat na listbox, ale pozor při odstraňování z Listboxu je třeba brát v úvahu snížení counteru a potřebu otestovat stejný index (řádky se posunou jakoby nahoru tzn na smazaném indexu v listu se objeví následující položka). 

Pokud bys chtěl, aby se na stisk tlačítka ty komentáře, když jsou vidět smazaly a když nejsou vidět  zobrazily, tak načíst soubor do LISTU a do Listboxu pak bud přenos celého Listu, nebo cyklem dle postupu výše bez komentářů.

Nahlásit jako SPAM
IP: 91.139.9.–
krpik0
Newbie
10. 9. 2019   #8
-
0
-

#7 MilanL
děkuji za odpověd

možná mě napadlo že by ty html komentaře mohl už mazat ve visualku přes Find Replace ale pokud je to na více řadu

<!-- koment

koment

koment -->

tak je to to stejné

Nahlásit jako SPAM
IP: 46.174.58.–
MilanL+1
Grafoman
12. 9. 2019   #9
-
0
-

#8 krpik
proto tam mám ten příznak začátku, aby to bylo schopné otestovat i víceřádkové komentáře, jen je třeba to použít i na tu řádku se začátkem.

tzn. ta podmínka 2) na test začátku komentáře je uzavřená 

nějak takhle by mohl být řešen ten cyklus při načítání řádek ze souboru:

dim komentar as boolean

komentar = false

For Each line As String In File.ReadAllLines(openfile.FileName)

	if not line.indexof("<!-") = -1 then
		komentar = True
	end if

	if komentar then
		if not line.indexof("-->") = -1 then
			komentar = False
		end if
	else
                ListBox1.Items.Add(line)
	end if

Next

ve 3. pak testuješ tu samou řádku na příznak konce a jsou třeba obsloužit obě větve then i else

Nahlásit jako SPAM
IP: 91.139.9.–
Seth
~ Anonymní uživatel
6 příspěvků
13. 9. 2019   #10
-
0
-

udělej to obráceně - uprav soubor před načtením do ListBoxu

  Private Sub RemoveRem(ByVal fName As String, ByVal lstBox As ListBox)
    Dim fix() As String
    Dim strR As New System.IO.StreamReader(fName)
    Dim txt As String = strR.ReadToEnd
    strR.Close()
    txt = System.Text.RegularExpressions.Regex.Replace(txt, "<!--[^\-]+-->", "")
    fix = Split(txt, vbCrLf)
    lstBox.Items.Clear()
    For i As Integer = 0 To fix.Length - 1
      If Trim(fix(i)) <> "" Then lstBox.Items.Add(fix(i))
    Next
  End Sub

a z OpenFileDialog při OK zavoláš

RemoveRem(tvuj_openfiledialog.FileName, tvuj_ListBox)
Nahlásit jako SPAM
IP: 37.44.18.–
MilanL+1
Grafoman
13. 9. 2019   #11
-
0
-

#10 Seth
taky možnost, ale jestli je to student a má to do školy, tak nevím jestli už brali Regulární výrazy a použití, Navíc ta zřetězená konstrukce může začátečníka zmást. Já to většinou beru algoritmicky, v podstatě ta zřetězená funkce s regulárním výrazem dělá v podstatě téměř to samé, hm zajímalo by mě srovnání rychlostí těch našich 2 algoritmů.

Nahlásit jako SPAM
IP: 91.139.9.–
Seth
~ Anonymní uživatel
6 příspěvků
14. 9. 2019   #12
-
0
-

#11 MilanL
Chápu, dal jsem jen řešení :) 

pokud má základy tak zvládne jak mé tak tvé řešení

Nahlásit jako SPAM
IP: 90.176.147.–
krpik0
Newbie
26. 9. 2019   #13
-
0
-

Děkuji moc za pomoc

vybral jsem první řešení ,které si upravuji a přidal jsem ji ještě další smazání

tedy nyní by se mi měli vyhledat a nepřidávat do listboxu věty které začínají /** a končí */

dále pak <!-- a končí -->

dále pak se mi z listboxu smažou řádky kde je //

problém je u <!-- --> nezapíše se mi text který začne <!-- a dále ale když to končí --> tak to se zapíše a to by ale nemělo

takže pokud mam

<!-- věta věta věta

věta věta věta

věta -->

tak aplikace mi do listboxu zapíše 

věta --> ' tohle by tu už nemělo být

dále u listboxu se bojím, že pokud bude text např.

věta která se nemaže /** smazat pouze toto */ - tak to smázné celý řádek

Dim openfile = New OpenFileDialog() With {.Filter = "Text (*.php)|*.php"}
        If (openfile.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then
            For Each line As String In File.ReadAllLines(openfile.FileName)

            Next
        End If
        dim komentar as boolean

        komentar = False

        For Each line As String In File.ReadAllLines(openfile.FileName)

            If Not line.IndexOf("<!-") = -1 Then
                komentar = True
            End If

            If komentar Then
                If Not line.IndexOf("-->") = -1 Then
                    komentar = False
                End If
            End If
            If Not line.IndexOf("/**") = -1 Then
                komentar = True
            End If

            If komentar Then
                If Not line.IndexOf("*/") = -1 Then
                    komentar = False
                End If
            Else
                ListBox1.Items.Add(line)
            End If

        Next

        Dim ValueToSearchFor As String = "//"

        For I As Integer = ListBox1.Items.Count - 1 To 0 Step -1



            If ListBox1.Items(I).ToString.Trim.Length = 0 Then


                ListBox1.Items.RemoveAt(I)

            Else

                If CheckBox3.Checked Then

                    If ListBox1.Items(I).ToString.IndexOf(ValueToSearchFor) <> -1 Then
                        ListBox1.Items.RemoveAt(I)
                    End If
                End If
            End If
        Next
Nahlásit jako SPAM
IP: 46.174.58.–
gna
~ Anonymní uživatel
1853 příspěvků
26. 9. 2019   #14
-
0
-

#13 krpik
Všimni si, jak jsem napsal Add mezi testy otevírací a uzavírací značky, právě proto aby ten příznak pokryl i uzavírací řádek.

Pokud ty značky můžou být uprostřed textu, tak odmažeš jen část od/do pozice, kterou ti vrátí indexOf.

Ale je to zbytečně složité. Prostě ten soubor nenačítej po řádcích, ale načti ho celý a vymaž ty komentáře jednoduchým Regexem.

Ideální by samozřejmě bylo požít nějaký pořádný X(HT)ML parser.

Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
27. 9. 2019   #15
-
0
-

#13 krpik
ahoj, ty věty s konci jsou způsobené tím, že to máš v samosatném IFu, když to máš takto, tak se ti otestuje konec, nastaví false a v poslední podmínce se ti to vyhodnotí jako ELSE.

Dost u toho záleží na pořadí, nejdřív je třeba otestovat v samostatných IF ty začátky pak vyhodnotit komentář a až nakonec testovat konce.

Konce na použití nebo konce je pak několik variant. jde hlavně o organizaci těch podmínek

       For Each line As String In File.ReadAllLines(openfile.FileName)

            If Not line.IndexOf("<!-") = -1 Then
                komentar = True
            End If

            If Not line.IndexOf("/**") = -1 Then
                komentar = True
            End If

            If not komentar Then
		
' sem lze přidat podmínku na //
'		 if line.indexof("//") =-1 then

                ListBox1.Items.Add(line)

'		end if
            End If

            If komentar Then
                If Not line.IndexOf("-->") = -1 Then
                    komentar = False
                End If
                If Not line.IndexOf("*/") = -1 Then
                    komentar = False
                End If
            end if
        Next

Když ti něco takto nejde, je třeba si zkusit představit ten průběh, té vlajky Komentář, v tom původném, jsi otestoval konce a nastavil Komentář na false a až pak jsi vyhodnocoval.

jinak ty podmínky by šli i sloučit:

            If (Not line.IndexOf("<!-") = -1) or
               (Not line.IndexOf("<!-") = -1) Then
                komentar = True
            End If

stejně pak i u konců.

problém by mohl nastat jedině při kombinaci kdy jeden typ komentáře vložíš do druhého, vezme to první konec vnitřního komentáře a zbytek do vnějšího konce se použije. Tam by se pak už muselo udělat i počítání konců - nepoužívat komentář jako true/false ale jako counter. Není komentář = 0, začátek> komentář+1, ,, konec> komentář-1.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
27. 9. 2019   #16
-
0
-

pokud bys chtěl i části řádků, kde je komentář za textem, muselo by se to dělat ještě jinak.

Nebo pak použít to řešení GNA  pomocí regexu, které by ti to dost zjednodušilo.

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý