VB2010:我正在使用RegEx取消识别文本块并标准化文本。也就是说,采用文本行并取消标识名称和确认代码,然后对文本进行规范化,以便数据按列排列。除了最后一部分,其中确认代码之前带有可变数量的点和长度为2到4个字符或可能丢失的包ID,我几乎拥有全部内容。
'regex
Dim MyRegex As Regex = New Regex("(?<pre>^\s{0,2}(\d{1,3})\s(\d\d))(.+?)(?<post>\.\.(\d{1,3})\." + "(\w)\s((\w+?|\.\.)))(?<dots>\.+)(\w{6})", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
'this is the replacement string
Dim replacement As String = "${pre}******/*****${post}${dots}******"
'replace the matched text in the InputText using the replacement pattern
Dim result As String = MyRegex.Replace(Input, replacement)
我的测试输入每行上都有一个数字,名称,数字,其他代码,程序包ID和确认代码:
1 01SMITH/CH..1.A E2T......AAABBB
2 01MTC..1.A ..............CCCDDD
3 01GRIFFIN/JOHN..1.A E2...EEEFFF
4 01EL/MARY..1.Z E2XT......GGGHHH
5 02BUBBA/BILLY..2.A E2....IIIJJJ
6 01HILL/THOR..1.A E2WW....KKKLLL
到目前为止,我的输出:
1 01******/*****..1.A E2T......******
2 01******/*****..1.A ..............******
3 01******/*****..1.A E2...******
4 01******/*****..1.Z E2XT......******
5 02******/*****..2.A E2....******
6 01******/*****..1.A E2WW....******
我要取消识别名称和确认代码,但是确认代码之前的代码包ID可变,因此不符合我的列式输出。有点卡在它的末端,但是真的很接近。我的目标是做到这一点一个正则表达式,但它可能是不可能的。是否可以填充正则表达式替换?
更新解决方案:
'regex (added one more group for the package id so I can determine its length)
Dim MyRegex As Regex = New Regex("(?<pre>^\s{0,2}(\d{1,3})\s(\d\d))(.+?)(?<post>\.\.(\d{1,3})\.(\w)\s(?<pkid>(\w+?|\.\.)))(?<dots>\.+)(\w{6})", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
'use the MatchEvaluator to examine each match and adjust accordingly
deid = MyRegex.Replace(deid, New MatchEvaluator(Function(m As Match)
Return m.Groups("pre").Value &
"******/*****" &
m.Groups("post").Value &
New String("."c, 5 - m.Groups("pkid").Value.Length) &
"******"
End Function))
我通过测试数据来运行,这是我得到的:
-----Input------------------------------------------------
1 01SMITH/CH..1.A E2T......AAABBB
2 01MTC..1.A ..............CCCDDD
3 01GRIFFIN/JOHN..1.A E2...EEEFFF
4 01EL/MARY..1.Z E2XT......GGGHHH
5 02BUBBA/BILLY..2.A E2....IIIJJJ
6 01HILL/THOR..1.A E2WW....KKKLLL
-----Output-----------------------------------------------
1 01******/*****..1.A E2T..******
2 01******/*****..1.A .....******
3 01******/*****..1.A E2...******
4 01******/*****..1.Z E2XT.******
5 02******/*****..2.A E2...******
6 01******/*****..1.A E2WW.******
----------------------------------------------------------
也许可以有更好的方法,但是可以使用正则表达式并Regex.Replace
使用MatchEvaluator
来实现所需的功能。
evaluator
类型:System.Text.RegularExpressions.MatchEvaluator
一个自定义方法,该方法检查每个匹配项并返回原始匹配的字符串或替换字符串。
关键是要获取第3组和第8组的长度,并重复*
相同的次数。要添加正斜杠,我们可以通过将Group 3的长度除以2来找到中间斜杠。这StrDup
是一个方便的函数,可将字符串“乘以”指定次数。
这是一个VB.NET代码:
Dim Input As String = "1 01SMITH/CH..1.A E2T......AAABBB" & Environment.NewLine & "2 01MTC..1.A ..............CCCDDD" & Environment.NewLine & "3 01GRIFFIN/JOHN..1.A E2...EEEFFF" & Environment.NewLine & "4 01EL/MARY..1.Z E2XT......GGGHHH" & Environment.NewLine & "5 02BUBBA/BILLY..2.A E2....IIIJJJ" & Environment.NewLine & "6 01HILL/THOR..1.A E2WW....KKKLLL"
Dim MyRegex As Regex = New Regex("(?<pre>^\s{0,2}(\d{1,3})\s(\d\d))(.+?)(?<post>\.\.(\d{1,3})\." + "(\w)\s((\w+?|\.\.)))(?<dots>\.+)(\w{6})", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
Dim result As String = MyRegex.Replace(Input, New MatchEvaluator(Function(m As Match)
Return m.Groups("pre").Value &
StrDup(m.Groups(3).Value.Length, "*").Insert(m.Groups(3).Value.Length / 2, "/") &
m.Groups("post").Value &
m.Groups("dots").Value &
StrDup(m.Groups(8).Value.Length, "*")
End Function))
Console.WriteLine(result)
结果:
1 01****/****..1.A E2T......******
2 01**/*..1.A ..............******
3 01******/******..1.A E2...******
4 01****/***..1.Z E2XT......******
5 02******/*****..2.A E2....******
6 01****/*****..1.A E2WW....******
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句