String aus bestimmter Satz herausfinden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Chinafreak.

    String aus bestimmter Satz herausfinden

    Hey Leute,

    Ich habe wieder eine Frage... aber diesmal ist es sehr schwierig... glaube ich zumindest :/

    Erstmal, schau euch mal dieser Beispiel-Textdatei an:

    [...]
    <backgrounds>
    <background visible="-1" foreground="0" name="background0" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    </backgrounds>
    [...]


    Ich würde gerne erstmal in Visual Basic so programmieren, das der herausfinden kann, wie viele Lines sich in einer TextDatei "<backround [...] />" erhalten. Dieser oberige Beispiel erhält 8 Zeilen von "<background ... />"

    Zweitens:

    Wie kann ich dieser String aus Variable:

    <background visible="-1" foreground="0" name="background0" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>


    nur "background0" rausfischen? Davor habe ich ganzer mit [STRING].Replace sowie [STRING].Remove gemacht... aber dies geht etwas schlechter, da der Name von "background0" sich jederzeit ändern kann.
    Ich habe mir so gedacht: 'finde 'name="' dann die String solange abkopieren, bis der nächste ' " ' kommt' (name=" <Name> ")... kann man ungefähr so umsetzen?

    Ich bedanke mich natürlich auf jeden Antworten!

    Liebe Grüße, China

    Chinafreak schrieb:

    Ich würde gerne erstmal in Visual Basic so programmieren, das der herausfinden kann, wie viele Lines sich in einer TextDatei "<backround [...] />" sich befindet. Dieser oberige Beispiel erhält 8 Zeilen von "<background ... />"

    Visual Basic-Quellcode

    1. dim counter as integer = 0
    2. for each line in IO.file.readAllLines("Path")
    3. counter += 1
    4. next


    Meinst du das ?
    Hallo,

    da deine Datei in diesem Fall eine Xml-Datei ist, nimm einen XmlReader und schaue, wie viele Elemente
    sich in dem Knoten backgrounds befinden.

    MFG

    Alex-Digital
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Stichwort wäre eigentlich XML-Reader.
    Damit ist das Parsen schon vorgegeben und auch sauber.

    Nicht so sauber, aber immer noch effektiv wäre es das mit RegEx zu machen. Würde ich aber nicht dem XML-Reader vorziehen.

    VB.NET-Quellcode

    1. 'Zeilen zählen
    2. Dim s As String = "<backgrounds>" &
    3. Environment.NewLine &
    4. "<background blabla/>" &
    5. "<background blabla/>" &
    6. "<background blabla/>" &
    7. "</backgrounds>"
    8. Dim r As New Regex("<background(.*?)\/>")
    9. MessageBox.Show(r.Matches(s).Count.ToString())
    10. 'Namen auslesen
    11. Dim s As String = "<background visible=""-1"" foreground=""0"" name=""background0"" x=""0"" y=""0"" htiled=""-1"" vtiled=""-1"" hspeed=""0"" vspeed=""0"" stretch=""0""/>"
    12. Dim r As New Regex("name=""(?<result>(.*?))""", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace Or RegexOptions.Multiline)
    13. MessageBox.Show(r.Match(s).Groups("result").Value)

    Kilian_98 schrieb:

    Chinafreak schrieb:

    Ich würde gerne erstmal in Visual Basic so programmieren, das der herausfinden kann, wie viele Lines sich in einer TextDatei "<backround [...] />" sich befindet. Dieser oberige Beispiel erhält 8 Zeilen von "<background ... />"

    Visual Basic-Quellcode

    1. dim counter as integer = 0
    2. for each line in IO.file.readAllLines("Path")
    3. counter += 1
    4. next

    Meinst du das ?


    Das gibt aber die gesamte Zeilen von TextDatei an anstatt nur in bestimmter Bereich.
    Daher hilft mir das leider nicht weiter. Aber danke für deiner Antwort!

    Alex-Digital schrieb:

    Hallo,

    da deine Datei in diesem Fall eine Xml-Datei ist, nimm einen XmlReader und schaue, wie viele Elemente
    sich in dem Knoten backgrounds befinden.

    MFG

    Alex-Digital


    Zwar hat der Datei ein andere Endungen und der TextDatei besteht nur zum teil aus XML... oder doch ganz XML... keine Ahnung :D

    Spoiler anzeigen

    <room>
    <caption></caption>
    <width>640</width>
    <height>480</height>
    <vsnap>32</vsnap>
    <hsnap>32</hsnap>
    <isometric>0</isometric>
    <speed>30</speed>
    <persistent>0</persistent>
    <colour>12632256</colour>
    <showcolour>-1</showcolour>
    <code></code>
    <enableViews>0</enableViews>
    <clearViewBackground>-1</clearViewBackground>
    <makerSettings>
    <isSet>0</isSet>
    <w>0</w>
    <h>0</h>
    <showGrid>0</showGrid>
    <showObjects>0</showObjects>
    <showTiles>0</showTiles>
    <showBackgrounds>0</showBackgrounds>
    <showForegrounds>0</showForegrounds>
    <showViews>0</showViews>
    <deleteUnderlyingObj>0</deleteUnderlyingObj>
    <deleteUnderlyingTiles>0</deleteUnderlyingTiles>
    <page>0</page>
    <xoffset>0</xoffset>
    <yoffset>0</yoffset>
    </makerSettings>
    <backgrounds>
    <background visible="-1" foreground="0" name="background0" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    <background visible="0" foreground="0" name="" x="0" y="0" htiled="-1" vtiled="-1" hspeed="0" vspeed="0" stretch="0"/>
    </backgrounds>
    <views>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    <view visible="0" objName="" xview="0" yview="0" wview="640" hview="480" xport="0" yport="0" wport="640" hport="480" hborder="32" vborder="32" hspeed="-1" vspeed="-1"/>
    </views>
    <instances/>
    <tiles/>
    <PhysicsWorld>0</PhysicsWorld>
    <PhysicsWorldTop>0</PhysicsWorldTop>
    <PhysicsWorldLeft>0</PhysicsWorldLeft>
    <PhysicsWorldRight>640</PhysicsWorldRight>
    <PhysicsWorldBottom>480</PhysicsWorldBottom>
    <PhysicsWorldGravityX>0</PhysicsWorldGravityX>
    <PhysicsWorldGravityY>10</PhysicsWorldGravityY>
    <PhysicsWorldPixToMeters>0.100000001490116</PhysicsWorldPixToMeters>
    </room>


    LaMiy schrieb:

    Stichwort wäre eigentlich XML-Reader.
    Damit ist das Parsen schon vorgegeben und auch sauber.

    Nicht so sauber, aber immer noch effektiv wäre es das mit RegEx zu machen. Würde ich aber nicht dem XML-Reader vorziehen.

    VB.NET-Quellcode

    1. 'Zeilen zählen
    2. Dim s As String = "<backgrounds>" &
    3. Environment.NewLine &
    4. "<background blabla/>" &
    5. "<background blabla/>" &
    6. "<background blabla/>" &
    7. "</backgrounds>"
    8. Dim r As New Regex("<background(.*?)\/>")
    9. MessageBox.Show(r.Matches(s).Count.ToString())
    10. 'Namen auslesen
    11. Dim s As String = "<background visible=""-1"" foreground=""0"" name=""background0"" x=""0"" y=""0"" htiled=""-1"" vtiled=""-1"" hspeed=""0"" vspeed=""0"" stretch=""0""/>"
    12. Dim r As New Regex("name=""(?<result>(.*?))""", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace Or RegexOptions.Multiline)
    13. MessageBox.Show(r.Match(s).Groups("result").Value)


    Das mit dem Zeilen auslesen... das würde nicht glaube ich nicht funktionieren, wie ich es wollte. Ich würde gerne die Zeilenmenge von <backgrounds> bis </backgrounds> aus dem Text/XML-Datei haben, und nicht in VB.Net :D

    Das mit dem Namen auslesen sieht interessant, das werde ich mir mal genauer anschauen.

    Danke für eure Antworten!

    [EDIT]

    Eben herausgefunden, das es ein XML-Files ist. Ich werde mal ein wenig forschen. Aber auf Antworten würde ich mich echt freuen!
    Die Datei ist doch ne stinknormale XML... oO

    PS: Du hast wohl als Tags "VB6" und ".Net 4.5" eingegeben. Also zu Zeiten von VB6 gabs noch kein .Net ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Auf dieser Seite bin ich auch gerade. Doch ich habe hier ein Problem:

    In XML ist der Width "1280" eingestellt:

    Quellcode

    1. Dim xmlstring As String = File.ReadAllText(OPEN.FileName)
    2. Using reader As XmlReader = XmlReader.Create(New StringReader(xmlstring))
    3. reader.ReadToFollowing("width")
    4. Dim Width As String = reader.Value
    5. End Using
    6. MsgBox(Width)

    Am Ende kriege ich die Wert von Width "1936"

    Was ist den da los? Ich habe dieses Gefühl, das ich irgendwass verpasst habe...
    Danke für eure Antworten!

    Danke Link275! Aber ich benutze lieber ein andere, etwas einfachere Methode :D :

    Quellcode

    1. Dim doc As XmlDocument = New XmlDocument()
    2. doc.LoadXml(File.ReadAllText(OPEN.FileName))
    3. Room_Level_Width = CInt(doc.SelectSingleNode("room/width").InnerText)
    4. Room_Level_Height = CInt(doc.SelectSingleNode("room/height").InnerText)
    5. Room_Level_GridX = CInt(doc.SelectSingleNode("room/hsnap").InnerText)
    6. Room_Level_GridY = CInt(doc.SelectSingleNode("room/vsnap").InnerText)
    7. Room_Level_Speed = CInt(doc.SelectSingleNode("room/speed").InnerText)
    8. Room_Level_Persistent = CInt(doc.SelectSingleNode("room/persistent").InnerText)
    9. Room_Level_Color = Hex(doc.SelectSingleNode("room/colour").InnerText)
    10. Dim i As Integer = 0
    11. For Each eventBackground As XmlNode In doc.SelectNodes("room/backgrounds/background")
    12. Room_Level_Background_Visible(i) = CInt(eventBackground.Attributes("visible").InnerText)
    13. Room_Level_Background_Foreground(i) = CInt(eventBackground.Attributes("foreground").InnerText)
    14. Room_Level_Background_BackImg(i) = eventBackground.Attributes("name").InnerText
    15. Room_Level_Background_x(i) = CInt(eventBackground.Attributes("x").InnerText)
    16. Room_Level_Background_y(i) = CInt(eventBackground.Attributes("y").InnerText)
    17. Room_Level_Background_htiled(i) = CInt(eventBackground.Attributes("htiled").InnerText)
    18. Room_Level_Background_vtiled(i) = CInt(eventBackground.Attributes("vtiled").InnerText)
    19. Room_Level_Background_hspeed(i) = CInt(eventBackground.Attributes("hspeed").InnerText)
    20. Room_Level_Background_vspeed(i) = CInt(eventBackground.Attributes("vspeed").InnerText)
    21. Room_Level_Background_stretch(i) = CInt(eventBackground.Attributes("stretch").InnerText)
    22. Room_Level_Background_path(i) = LevelEditor_Path.Replace("rooms\", "") + "background\images\" + Room_Level_Background_BackImg(0) + ".png"
    23. i += 1
    24. Next


    funktioniert soweit auch gut... Aber hat jemand eine Idee, wie ich mehrere "public" Arrays erstellen kann, wenn "public" Arrays schon bereits erstellt wurde?