2014-02-12 4 views
1

Я конвертирую текстовый файл в текстовый файл с разделителями с разделителями-табуляторами и сталкивается с некоторой проблемой. Я могу получить все, что мне нужно, чтобы работать так, как я хочу, за исключением одной маленькой части.VB.Net Новичок: замените подстановочными знаками, возможно, RegEx?

В одном поле, в котором я работаю, есть домашние адреса предметов в виде одной записи («1234 Happy Lane Somewhere, St 12345»), и мне нужно, чтобы каждый разбился на улицу (Tab) City (Tab) State (Tab) State (Tab) Tab) Zip. Одна часть, на которой я повесил трубку, - это вкладка между государством и почтой.

Я использую input = input.Replace повсюду, и он хорошо работает до сих пор, но я не могу придумать, как распутать этот. Подстановочные знаки, к которым я привык, похоже, не работают, я не могу заменить («?? #####») на («??» + ControlChars.Tab + «#####») ... что я честно не ожидал, что работаю, но это единственная идея по моему делу.

Я немного читал об использовании Regex, но у меня нет опыта, и это кажется немного ... подавляющим.

Является ли Regex моим лучшим вариантом для этого? Если нет, есть ли другие предложения по решениям, которые я, возможно, пропустил?

Спасибо за ваше время. :)

EDIT: Вот что я использую до сих пор. Он делает некоторые изменения в соответствующей строке, заботясь о пробелах, запятых и других текстах, которые мне не нужны, но у меня нет ничего для ситуации State/Zip; У меня плохая привычка вытирать что-то, если оно не работает, но я добавлю последнее, что я использовал до самого конца, если это поможет.

If input Like "Guar*###/###-####" Then 
input = input.Replace("Guar:", "") 
input = input.Replace(" ", ControlChars.Tab) 
input = input.Replace(",", ControlChars.Tab) 
input = "C" + ControlChars.Tab + strAccount + ControlChars.Tab + input 
End If 

input = System.Text.RegularExpressions.Regex.Replace(" #####", ControlChars.Tab + "#####") <-- Just one example of something that doesn't work. 

Это то, что написано на входе в данном примере

"   Guar: LASTNAME,FIRSTNAME 999 E 99TH ST CITY,ST 99999 Tel: 999/999-9999" 

И это то, что я могу получить в результате до сих пор

C 99999/9 LASTNAME FIRSTNAME 999 E 99TH ST CITY ST 99999 999/999-9999 

Со всем быть именно то, что мне нужно, кроме бит «ST 99999» (с фактическими данными, явно опущенными для обеспечения конфиденциальности и профессиональных нот).

UPDATE: Когда я думал, что все это в квадрате, у меня есть еще одна загвоздка. Необработанные данные дают мне это.

# TERMINOLOGY ######### ##/##/#### # ###.## 

И конечный результат дает мне это, потому что это фрагмент данных, который был очень хорошо, как есть ..., прежде чем я извлекал Вкладки. Теперь мне нужен способ заменить их после того, как они были удалены, или опустить эту небольшую группу кода из общего генома Tab Tab, с которого я запускаю код.

#TERMINOLOGY###########/##/########.## 

Возможно ли вариант на rgx.Replace работать лучше всего здесь? Или я могу скопировать код в переменную, удалить вкладки из документа, а затем вставить переменную без потери вкладок?

+0

Было бы полезно ознакомиться с кодом, который вы написали до сих пор. Да, регулярное выражение похоже на инструмент для этой работы, но если вы представите пример, кто-то может легко предоставить вам нужную вам линию. (Кроме того, нам нравится видеть усилие.) –

+0

Oh. Конечно. Тем не менее, у меня нет большой веры в мой код. Мел это до постоянного ощущения, что я над головой. Я отредактирую некоторых в исходное сообщение. – Eiketsu

+0

Состояние и почтовый индекс все разные в документе. Это одна вещь, которая заставила меня повесить на понимание приложения Regex.Replace. – Eiketsu

ответ

0

Я думаю, что вы ищете,

Dim r As New System.Text.RegularExpressions.Regex(" (\d{5})(?!\d)") 
Dim input As String = rgx.Replace(input, ControlChars.Tab + "$1") 

Первая строка компилирует регулярное выражение. \d соответствует цифре, а {5}, как можно догадаться, соответствует 5 повторениям предыдущего атома.Скобки, расположенные вокруг \d{5}, известны как группа захвата и отвечают за то, что было записано в псевдокавируемом названии $1. (?!\d) - это более продвинутое понятие, известное как отрицательное выражение , и оно в основном заглядывает к следующему символу, чтобы проверить, что это не цифра (потому что тогда это может быть номер из 6 или более цифр, где первые 5 произошло, чтобы получить соответствие). Другая версия

" (\d{5})\b" 

где \b является граница слова, запрещая буквенно-цифровые символы следующие цифры.

+0

Ну, он нашел правильное место в записи, но введите \ t, вот так. C 99999/9 LASTNAME FIRSTNAME 999 E 99TH ST CITY ST \ t99999 \t 999/999-9999 Существует ли другой синтаксис для табуляции? Потому что кроме этого (мой едва следовать за ним, хотя спасибо за солидное объяснение!), Похоже, я сделал то, что было после. – Eiketsu

+0

@ Эйкецу - О, мой плохой. Я забыл, что это был VB.NET. Позвольте мне изменить. Ладно, теперь попробуй. –

+0

И ваше объяснение действительно помогает мне следовать вместе с http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx, так что спасибо за это. – Eiketsu

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