2015-07-29 6 views
0

Как я могу найти строку внутри другой, а затем выбрать все символы до конца строки? Например, если эта строка:VB NET String Search

имя_принтера PDFCreator

PortName: PDFCreator:

Статус: Неизвестный

DriverName: PDFCreator

имя_принтера Lexmark E360dn XL

PortName: someport

Статус: Неизвестный

DriverName: Lexmark E360dn XL

HostAddress: somehostaddress

Я хотел бы найти строку: "PRINTERNAME", как только он находит его, добавить его в выпадающий список, для того, для получения только имени принтера. До сих пор я писал:

Dim TextSearched As String = tmp.Text 
    Dim Paragraph As String = "PrinterName:" 
    Dim location As Integer = 0 
    Dim occurances As Integer = 0 

    Do 

     location = TextSearched.IndexOf(Paragraph, location) 

     If location <> -1 Then 

      occurances += 1 
      If TextSearched.EndsWith(vbCrLf) Then 

       Debug.Print(TextSearched.Substring(location, TextSearched.IndexOf(vbCrLf))) 

      End If 
      location += Paragraph.Length 

     End If 



    Loop Until location = -1 

где tmp.Text это длинная строка, как в приведенном выше примере.

Когда я запускаю его я получаю что-то вроде этого:

PrinterName: PDFCreator

имя_принтера Lexmark E3

я не получаю "360dn XL"

ответ

1

вы дали какой-либо мысли к использованию Regex? Вы можете использовать шаблон, как:

"PrinterName: (.*?)\r\n" 

Который должен найти строку в длинную строку и захватить данные в группе 1. Вы бы получить доступ к результату, как это:

Imports System.Text.RegularExpressions 

Module Module1 
    Sub Main() 
     Dim TextSearch As String = _ 
      "PrinterName : PDFCreator()" + vbCrLf + _ 
      "PortName: PDFCreator()" + vbCrLf + _ 
      "Status: Unknown()" + vbCrLf + _ 
      "DriverName: PDFCreator()" + vbCrLf + _ 
      "PrinterName: Lexmark E360dn XL" + vbCrLf + _ 
      "PortName: someport()" + vbCrLf + _ 
      "Status: Unknown()" + vbCrLf + _ 
      "DriverName: Lexmark E360dn XL" + vbCrLf + _ 
      "HostAddress: somehostaddress()" 

     Dim Matcher = Regex.Match(TextSearch, "PrinterName: (.*?)\r\n") 
     If Matcher.Success Then 
      Console.WriteLine(Matcher.Groups(1)) 
     End If 
    End Sub 
End Module 

Результаты:

Lexmark E360dn XL 

Вы должны добавить Matcher.Groups(1) в свой список.

+0

Большое спасибо. Я не знал о существовании Regex; Я открыл свой разум. Танк снова сэр. – Vesco

1

Это включает в себя некоторые простой синтаксический анализ с использованием методов расширения IndexOf и SubString. Вот пример, который помещает все значения PRINTERNAME в список (из строки) .:

Dim lstLines As List(Of String) = IO.File.ReadAllLines("C:\Your\Location\tmp.txt").ToList() 

    Dim lstPrinters As New List(Of String) 

    lstLines.ForEach(Sub(strLine As String) 
         If strLine.IndexOf("PrinterName:") > -1 Then 
          lstPrinters.Add(strLine.Substring(strLine.IndexOf("PrinterName:") + 13)) 
         End If 
        End Sub) 
+0

Спасибо, я действительно ценю ваш ответ, но я даю ответ на Shar1er80 причину я Бесполезный Знать о существовании Regex. – Vesco

1

Еще один ...

Dim TextSearch As String = 
     "PrinterName : PDFCreator()" + vbCrLf + 
     "PortName: PDFCreator()" + vbCrLf + 
     "Status: Unknown()" + vbCrLf + 
     "DriverName: PDFCreator()" + vbCrLf + 
     "PrinterName: Lexmark E360dn XL" + vbCrLf + 
     "PortName: someport()" + vbCrLf + 
     "Status: Unknown()" + vbCrLf + 
     "DriverName: Lexmark E360dn XL" + vbCrLf + 
     "HostAddress: somehostaddress()" 

    Dim printers As List(Of String) = TextSearch.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries).Where(Function(x) x.ToLower.StartsWith("printername")).Select(Function(x) x.Split(":").Last).ToList 
    For Each printer As String In printers 
     Debug.Print(printer) 
    Next 

Это также может быть записана в виде:

Dim TextSearch As String = 
     "PrinterName : PDFCreator()" + vbCrLf + 
     "PortName: PDFCreator()" + vbCrLf + 
     "Status: Unknown()" + vbCrLf + 
     "DriverName: PDFCreator()" + vbCrLf + 
     "PrinterName: Lexmark E360dn XL" + vbCrLf + 
     "PortName: someport()" + vbCrLf + 
     "Status: Unknown()" + vbCrLf + 
     "DriverName: Lexmark E360dn XL" + vbCrLf + 
     "HostAddress: somehostaddress()" 

    Dim printers = From printer In TextSearch.Split(vbCrLf.ToCharArray) 
        Where printer.ToLower.StartsWith("printername") 
        Select printer.Split(":").Last 
    For Each printer As String In printers 
     Debug.Print(printer) 
    Next 
+0

Спасибо, я очень ценю ваш ответ, но я даю ответ Shar1er80, потому что я не знал о существовании Regex. – Vesco

+0

Нет проблем. Мне очень нравится этот [RegEx Tutorial] (http://www.regular-expressions.info/tutorial.html) сайт. –