2014-12-17 2 views
0

Есть ли способ активно сканировать текстовое поле для поиска ключевых разделителей? Я ищу разделители: vbNewLine, запятая, двоеточие, точка с запятой и пробел.VB.NET: определение разделителя в текстовой строке ввода

Как только пользователь вставляет свою разделительную строку, как я могу определить VB.net, какой символ делится?

Пример:

входная строка: «ааа, ГЭБ, ссс»

Я хочу, чтобы иметь возможность сканировать этот текст и знать, что разделителем является «»

То же самое для «ааа ; bbb; ccc ", будет"; "

Может быть любое количество значений между разделителями

+0

А что критерии? В строке из трех символов ';,', которую следует считать разделителем? – Neolisk

+0

К сожалению, добавлено более подробно – Sev09

+1

Хорошо, что, если это 'aaa; bbb, ccc'? – Neolisk

ответ

3

Вы можете использовать следующий класс для этого, ClosestDelimiter дает ограничитель, который имеет наибольший шанс согласования (в случае, если он не найдет то, что ищет , он выдаст ошибку, будьте предупреждены :))

Я также добавил метод Parse, который возвращает массив отдельных элементов (может содержать пустые строки в случае, если разделитель появляется непосредственно после предыдущего разделителя, например:; ;; C ;; D)

И, наконец, TryParse метод, который возвращает истину или ложь, и перехватывает исключения для вас, обновленный результат в настоящее время синтаксического анализа не удалось

Public Class DelimiterScanner 
    Private delimiters() As String = {vbNewLine, ",", ";", ":", " "} 

    Public Function ClosestDelimiter(row As String) As String 
     Dim maxUsages As Integer = 0 
     Dim multiplePossibilities As Boolean = False 
     Dim current As Integer 
     Dim delimiter As String = Nothing 

     If String.IsNullOrWhiteSpace(row) Then 
      Throw New ArgumentException("Row cannot be an empty string", "row") 
     End If 

     For Each del As String In delimiters 
      current = row.Split({del}, StringSplitOptions.None).Count 
      If current > maxUsages Then 
       delimiter = del 
       maxUsages = current 
       multiplePossibilities = False 
      ElseIf current > 0 AndAlso current = maxUsages Then 
       multiplePossibilities = True 
      End If 
     Next 
     If multiplePossibilities Then 
      Throw New FormatException("Multiple delimiters have the same length") 
     End If 
     If maxUsages = 0 Then 
      Throw New FormatException("No delimiters found in row") 
     End If 
     Return delimiter 
    End Function 

    Public Function Parse(row As String, Optional useDelimiter As String = Nothing) As String() 
     Dim selectedDelimiter As String = useDelimiter 
     Dim result() As String = Nothing 

     If String.IsNullOrWhiteSpace(row) Then 
      ' don't parse empty strings 
      Throw New ArgumentException("Cannot parse an empty input value", row) 
     End If 
     If String.IsNullOrWhiteSpace(selectedDelimiter) Then 
      ' get delimiter if no basic is given 
      selectedDelimiter = ClosestDelimiter(row) 
     End If 
     result = row.Split({selectedDelimiter}, StringSplitOptions.None) 

     Return result 
    End Function 

    Public Function TryParse(row As String, ByRef result() As String, Optional useDelimiter As String = Nothing) As Boolean 
     Dim succeeded As Boolean = True 

     Try 
      result = Parse(row, useDelimiter) 
     Catch ex As Exception 
      result = Nothing 
      succeeded = False 
     End Try 
     Return succeeded 

    End Function 
End Class 

UPDATE

В качестве примера, вы можете использовать этот класс, как это (здесь вы видите основной метод для моего класса консоли). Сначала мы инициализируем новый класс, а затем проверяем, может ли он анализироваться с помощью метода TryParse, если нет, синтаксический анализ недействителен, и разделитель еще не может быть определен. Если это было действительно, вы можете вызвать метод ClosestDelimiter, и вы также можете предположить, что ваш результат содержит правильные строки.

Я также сделал обновление до сих пор на SplitMethod, так как я должен принять во внимание, что мы хотим разделить на струнах, а не на отдельных символов (например: VbNewLine), я также исправил это в коде выше

Sub Main() 
    Dim dScanner As New DelimiterScanner() 
    Dim result() As String = Nothing 
    Dim tests() As String = {String.Empty, "a,b;c", "aaa,bbb,ccc;", "a;b;c;;;;d", "this is a test;working;online;stackoverflow;", "aaa" + vbNewLine + "bbb" + vbNewLine + "ccc"} 

    For Each testItem In tests 
     Console.WriteLine("Trying to parse {0}", testItem) 
     If dScanner.TryParse(testItem, result) Then 
      Console.WriteLine(vbTab & "- Results (joined with ,): {0}", String.Join(",", result)) 
      Console.WriteLine(vbTab & "- Used delimited: {0}", dScanner.ClosestDelimiter(testItem)) 
     Else 
      Console.WriteLine(vbTab & "- Delimiter cannot be found!") 
     End If 
    Next 
    Console.ReadLine() 
End Sub 

И результат будет тогда следующее:

Trying to parse 
     - Delimiter cannot be found! 
Trying to parse a,b;c 
     - Delimiter cannot be found! 
Trying to parse aaa,bbb,ccc; 
     - Results (joined with ,): aaa,bbb,ccc; 
     - Used delimited: , 
Trying to parse a;b;c;;;;d 
     - Results (joined with ,): a,b,c,,,,d 
     - Used delimited: ; 
Trying to parse this is a test;working;online;stackoverflow; 
     - Results (joined with ,): this is a test,working,online,stackoverflow, 
     - Used delimited: ; 
Trying to parse aaa 
bbb 
ccc 
     - Results (joined with ,): aaa,bbb,ccc 
     - Used delimited: 

Надеется, что это помогает :)

+0

Спасибо, Icepickle! Это выглядит великолепно. Есть ли способ, которым это можно настроить для работы в 'Private Sub txtInput_TextChanged (отправитель As System.Object, e As System.EventArgs) Обрабатывает txtInput.TextChanged'? – Sev09

+0

Что бы вы хотели сделать в это время? Что мешает вам использовать класс непосредственно в мероприятии? – Icepickle

+0

Я бы хотел, чтобы это было в событии с измененным текстом, чтобы автоматически выбрать, как вставляемый текст будет разграничен. Затем он будет использовать вывод вашей логики для автоматического выбора соответствующего метода разделителя из раскрывающегося списка. Пример: ваша логика определяет, что вставленная строка делится на «,», поэтому она выбирает индекс в раскрывающемся списке для «,». Я по-прежнему новичок в программировании, но могу понять логистику, если вы можете указать мне в правильном направлении, как назвать этот класс из события TextChanged. Пожалуйста, дайте мне знать, если неясно, и еще раз спасибо! – Sev09