2016-06-02 8 views
0

Ich habe eine Zeichenfolge, die von einem Server zurückgegeben wird, und ich muss einige Informationen von ihm erhalten. Dies ist die Zeichenfolge:Brauchen Sie Hilfe Aufteilen einer Zeichenfolge in VB

(Lager-info (msg-id 57) (reply-to 4) (ref "IC00000000234" std) (gesamt (Kästen 61)) (gültig (Kästen 61)))

Ich muss die Gesamtzahl der Kästchen und die gültigen Kästchen abrufen und sie in Parameter eingeben. Ich habe versucht, Teilstrings zu verwenden und die Saite in verschiedene Teile aufzuteilen, das Problem ist, dass diese Saite unterschiedliche Längen haben kann, so dass sie immer das richtige Ergebnis bringen. Jede Hilfe wäre willkommen.

Dank

Antwort

1

Es gibt viele Möglichkeiten, um Ihr Problem zu lösen:

 Dim MyString As String = "(stock-info (msg-id 57) (reply-to 4) (ref ""IC00000000234"" std) (total (boxes 61)) (valid (boxes 61)))" 
    Dim SringExtracted As String = "" 
    Dim MyKey As String = "" 

    'Total Boxes 
    MyKey = "(total (boxes" 
    SringExtracted = MyString.Substring(MyString.LastIndexOf(MyKey) + MyKey.Length) 
    SringExtracted = Microsoft.VisualBasic.Left(SringExtracted, SringExtracted.IndexOf("))")) 
    Dim TotalBoxes As Integer = Val(SringExtracted) 

    'Valid Boxes 
    MyKey = "valid (boxes" 
    SringExtracted = MyString.Substring(MyString.LastIndexOf(MyKey) + MyKey.Length) 
    SringExtracted = Microsoft.VisualBasic.Left(SringExtracted, SringExtracted.IndexOf("))")) 
    Dim ValidBoxes As Integer = Val(SringExtracted) 
+0

Vielen Dank. Ich sehe jetzt, warum ich es nicht zur Arbeit bringen konnte. – Brownd92

1

Diese funktionieren soll. Teilt die Zeichenfolge durch "Boxen", ignoriert den ersten Teil der Zeichenfolge und entfernt dann alle nicht numerischen Zeichen für die verbleibenden zwei Zeichenfolgen (in Char-Array-Form), bevor sie wieder in eine Zeichenfolge konvertiert werden. Wenn Sie sie als Ganzzahl haben wollen, dann parsen Sie sie danach.

Dim myString = "(stock-info (msg-id 57) (reply-to 4) (ref 'IC00000000234' std) (total (boxes 61)) (valid (boxes 61)))" 

Dim splitArray = myString.Split("boxes ").Skip(1) 

Dim totalBoxesAsString = New String(splitArray.First.Where(Function(c) Char.IsDigit(c)).ToArray()) 
Dim validBoxesAsString = New String(splitArray.Last.Where(Function(c) Char.IsDigit(c)).ToArray()) 
1

Dies ist die Art von Problem, bei dem ein regulären Ausdruck nützlich sein kann:

Option Infer On 
Option Strict On 

Imports System.Text.RegularExpressions 

Module Module1 

    Sub Main() 

     Dim s = "(stock-info (msg-id 57) (reply-to 4) (ref ""IC00000000234"" std) (total (boxes 61)) (valid (boxes 48)))" 

     Dim reTotal As New Regex("total \(boxes ([0-9]+)") 
     Dim reValids As New Regex("valid \(boxes ([0-9]+)") 

     ' initialise with a value than cannot appear in the string 
     ' so it can be checked for later if needed 
     Dim totalBoxes As Integer = -1 
     Dim validBoxes As Integer = -1 

     If reTotal.IsMatch(s) Then 
      totalBoxes = CInt(reTotal.Match(s).Groups(1).Value) 
     End If 

     If reValids.IsMatch(s) Then 
      validBoxes = CInt(reValids.Match(s).Groups(1).Value) 
     End If 

     Console.WriteLine($"Total: {totalBoxes} Valid: {validBoxes}") 
     Console.ReadLine() 

    End Sub 

End Module 

Ausgänge:

Insgesamt wurden 61 Gültig: 48

0

Sie könnten für diese Situation reguläre Ausdrücke verwenden. https://msdn.microsoft.com/en-us/library/hs600312(v=vs.110).aspx

Imports System.Text.RegularExpressions 

Dim input As String = "(stock-info (msg-id 57) (reply-to 4) (ref ""IC00000000234"" std) (total (boxes 60)) (valid (boxes 61)))" 
For Each match As Match In Regex.Matches(input, "\(total \(boxes (\d+)\).+\(valid \(boxes (\d+)\)") 
    Console.WriteLine("Total={0}, Valid={1}", match.Groups.Item(1).Value, match.Groups.Item(2).Value) 
Next