2015-01-12 4 views
-1

Попытка найти наиболее эффективный способ сделать это и задавалась вопросом, могут ли регулярные выражения быть полезными в этом случае.Извлечение ряда строк из массива с использованием Regex

Я перебираю массив строк до тех пор, пока не нахожу строку, которая начинается с или содержит следующий шаблон: abc 1234. До сих пор я занимался двумя форматами - одним пробелом и двумя пробелами. Хотя в некоторых случаях может быть больше пробелов.

Затем я ввести то время как цикл, который должен в цикле и процесс каждой линии до тех пор пока он находит другой образец, который также startes с «ABC», но за которым следует число, отличное от 1234.

If MyArray(i).ToString(0.ToLower().StartsWith("abc 1234") or If MyArray(i).ToString(0.ToLower().StartsWith("abc 1234") 

    While Not MyArray(i).ToString().ToLower().StartsWith("abc") 

     ''process line here 

      i+=1 
     End while 
end if 

Дело в том, что массив содержит кучу строк, которые смотрят с помощью «abc 1234», поэтому я никогда не знаю, когда выходить до тех пор, пока я не столкнусь с другим шаблоном «abc», но с другим номером. Я не хочу выходить из цикла while, если встречается другой шаблон «abc 1234», поэтому использование «abc» в условиях цикла не будет достаточным

Может ли кто-нибудь помочь?

Я думал использовать функцию в моем состоянии в то время как петля т.е.

Function CheckForEnd(ByVal input As String, ByVal pattern As String) As Boolean 
    Dim result As Boolean = False 
    If Regex.Split(pattern, "[ ]{1,}").Length = 2 Then 
     If Regex.Split(input, "[ ]{1,}").Length > 2 Then 
      If Regex.Split(input, "[ ]{1,}")(0).Trim().Equals(Regex.Split(pattern, "[ ]{1,}")(0).Trim()) Then 
       If Regex.Split(input, "[ ]{1,}")(1).Trim().Equals(Regex.Split(pattern, "[ ]{1,}")(1).Trim()) Then 
        result = True 
       End If 
      End If 
     End If 
    End If 

    Return result 
End Function 

Так мой, пока цикл выглядит следующим образом:

While Not CheckForEnd(MyArray(I),"abc 1234") 
    ''my code here 

    I+=1 
End While 

Но я не уверен, что это наиболее эффективный способ сделай это. Пожалуйста, советы

Вот пример:

«Это тестовая строка.»

"Это еще один тест строка"

"а 1234 (100-00)"

"Это еще одно предложение"

"это последовательность чисел: 34566900"

"а 1234 (300-01)"

"Больше не связанные вещи ...."

«а 7890 (500-01) теста»

«больше материала ...»

«другая строка»

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

"ABC 1234 (100-00)"

"Это еще одно предложение"

«Это последовательность чисел: 34566900"

"а 1234 (300-01)"

«Больше не связанные вещи ...."

Так что петля через него, после того, как я сталкиваюсь первыми а 123 и функция помогает мне проверить каждую строку для появления следующего аЬса, за которой следует число, отличного от 1234.

+0

[txt2re] (http://txt2re.com/) очень полезен для этого. – cybermonkey

+0

Не могли бы вы прояснить, как это можно использовать в моем конкретном случае? – ElenaDBA

ответ

-1

В коде ниже CheckForEnd возвращает True если комбинация кроме 1234 используется с abc.

Регулярные выражения требуют доступа к RegularExpressions имен, таким образом, вы должны будете сделать Imports System.Text.RegularExpressions также.

Sub exampleSubroutine() 
    [.declare MyArray here.] 
    Dim i As Integer = 0 

    While Not CheckForEnd(MyArray(i)) 
     i += 1 
     If (MyArray.Count() = i) Then 'Stop a crash if we reach the end of the array. 
      Exit While 
     End If 
    End While 

    ProcessMatch(MyArray(i)) 

End Sub 

Sub ProcessMatch(ByVal match As String) 
    [.process matched line here.] 
End Sub 

Function CheckForEnd(ByVal input As String) As Boolean 
    Dim re1 As String = "(.*?)^((?!abc 1234).)*$(.*?)" 

    Dim r As Regex = New Regex(re1, RegexOptions.IgnoreCase Or RegexOptions.Singleline) 
    Dim m As Match = r.Match(input) 
    If (m.Success) Then 
     Dim word1 = m.Groups(1) 
     Dim ws1 = m.Groups(2) 
     Dim d1 = m.Groups(3) 
     Return True 
    End If 
    Return False 
End Function 
+0

Я пробовал функцию следующим образом, передавая «abc 1234» в качестве аргумента и возвращал true в строке, которая не имеет ничего удаленного, как abc 1234 Dim re1 As String = "^ ((?!) & pattern & ").) * $" Я также проверил функцию с abc 1234 hardcoded, а также вернул true в строке, которая не содержала целевое значение. Слову 1 была назначена точка (.) – ElenaDBA

+0

@ElenaDBA. Пожалуйста, вы можете привести пример своего массива в своем вопросе. Я тестировал код, и он работает в ситуации, которую вы описываете, и это, безусловно, будет * не * возвращать точку для слова «word1» ***, если ваш массив не имеет значения с точкой вместо 'abc'. *** – cybermonkey

+0

конкретное значение в массиве просто содержало регулярное предложение с точкой в ​​конце. Ни одна цифра и ни одна компиляция «abc» – ElenaDBA

Смежные вопросы