2012-02-08 2 views
4

Это довольно сложное регулярное выражение, которое возвращает массив пар ключ/значение из запатентованной строки данных. Вот пример данных, если курьер не может быть использован в .Net, и нужно использовать другой метод.Как преобразовать этот шаблон соответствия PHP RegEx в .Net

0,"101"1,"12345"11,"ABC Company"12,"John Doe"13,"123 Main St"14,""15,"Malvern"16,"PA"17,"19355"19,"UPS"21,"10"22,"GND"23,""24,"082310"25,""26,"0.00"29,"1Z1235550300000645"30," PA 193 9-05"34,"6.55"37,"6.55"38,"8.05"65,"1Z1235550300000645"77,"10"96,""97,""98 

Если вы посмотрите внимательно вы видите его key, «value», key, «value» Единственная гарантия на форматирование является то, что каждая пара ключей значения разделяются запятой, и каждое значение будет всегда заключенная в двойные кавычки. Основная проблема (причина, по которой вы не можете ее разбить) - это плохой выбор предыдущего кодера для разделения ключей и значений с тем же символом, что и записи. В любом случае, из моих рук. Вот рабочий пример PHP.

function parseResponse($response) { 
    // split response into $key, $value pieces 
    preg_match_all("/(.*?),\"(.*?)\"/", $response, $m); 

    // loop through pieces and format 
    foreach($m[1] as $index => $key) { 
      $value = $m[2][$index] 
       echo $key . ":" . $value; 
     // this will output KEY:VALUE for each entry in the string 
      } 
    } 

Вы можете видеть выражение /(.*?),\"(.*?)\"/

Вот что я имею в VB .Net

Imports System.Text.RegularExpressions 
Public Class Parser 
    Private Sub parseResponse(ByVal response As String) 
     Dim regExMatch As Match = Regex.Match(response, "/(.*?),\""(.*?)\""/") 

    End Sub 
End Class 

ответ

3

Вы должны удалить PHP разделители:

Dim RegexObj As New Regex("(.*?),""(.*?)""") 

Кроме того, лучше уточнить, что можно сопоставить (делает регулярное выражение намного более эффективным):

Dim RegexObj As New Regex("([^,]*),""([^""]*)""") 

Теперь первая группа соответствует только символам, которые не являются запятыми, а вторая соответствует только символам, которые не являются кавычками. Между прочим, оба регулярных выражения потерпели бы неудачу, если бы у вас были скрытые кавычки в ваших данных.

Чтобы получить все матчи в строке, используйте

AllMatchResults = RegexObj.Matches(response) 
+0

Это не работает должным образом, то, кажется, возвращает только первый пункт, я попробовал для/каждого не повез. Мне нужно обрабатывать эти пары ключ/значение по одному, как в примере php. –

+0

@MikeL: Вам нужен метод '.Matches()', а не '.Match()'. –

+0

Спасибо! мы выяснили это в то же время ... Для каждого т в матче в матчах –

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