2014-02-12 115 views
1

我正在将文本文件转换为制表符分隔的文本文件,并遇到了一点障碍。除了一小部分,我可以按我想要的方式获得所需的一切。VB.Net初学者:替换通配符,可能正则表达式?

我正在使用的一个字段的主题地址为单个条目(“1234 Happy Lane Somewhere,St 12345”),我需要按街道(Tab)城市(Tab)状态(选项卡)邮编。我挂断的一部分是国家和邮编之间的选项卡。

我一直在使用input = input.Replace遍历,到目前为止效果很好,但我想不出如何解决这个问题。我用过的通配符似乎没有工作,我无法用(“??”+ ControlChars.Tab +“#####”)替换(“?? #####”) ......我真的没有想到会工作,但这是我对此事的唯一想法。

我读过一些关于使用正则表达式,但没有经验,它似乎有点......压倒性的。

Regex是我最好的选择吗?如果没有,是否还有其他解决方案建议我可能错过了?

谢谢你的时间。 :)

编辑:这是我到目前为止使用的。它对有关的行进行了一些编辑,照顾空格,逗号和其他我不需要的文本,但对于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”位(实际数据明显被省略,隐私和专业whatnots)。

更新:正当我以为这一切都摆平了,我还有另一个障碍。原始数据给了我这个。

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

而最终的结果是给我这个,因为这是一个很好的数据块,在我删除标签之前。现在,我需要一种方法在它们被移除后替换它们,或者从我启动代码的文档范围Tab种族灭绝中省略这一小组代码。

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

rgx.Replace上的变体在这里最适合吗?或者我可以将代码复制到变量中,从文档中删除选项卡,然后插入变量而不会丢失选项卡?

+0

看到您迄今为止编写的代码会很有帮助。是的,正则表达式听起来就像是这个工作的工具,但如果你提供一个例子,有人可以很容易地给你你需要的线。 (另外,我们喜欢看看努力。) –

+0

哦。当然。不过,我大部分时间对代码没有太多的信心。喋喋不休地沉浸在我的脑海中。我将编辑一些到原来的帖子.. – Eiketsu

+0

虽然状态和zip在整个文档中都是不同的。这是让我在理解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 是否有不同的语法用于Tab?因为除此之外(我几乎没有关注它 - 尽管感谢你给出了坚实的解释!),它似乎完成了我以前的工作。 – Eiketsu

+0

@Eiketsu - 哦,我的坏。我忘了这是VB.NET。让我编辑。好的,现在试试。 –

+0

而你的解释确实有助于我跟随http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx,所以也非常感谢你。 – Eiketsu