Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex.Replace可对列式文本进行标识/规范化_Regex_Vb.net_Replace_Multiple Columns_Pad - Fatal编程技术网

Regex.Replace可对列式文本进行标识/规范化

Regex.Replace可对列式文本进行标识/规范化,regex,vb.net,replace,multiple-columns,pad,Regex,Vb.net,Replace,Multiple Columns,Pad,VB2010:我正在使用正则表达式来取消识别文本块,并对文本进行规范化。也就是说,获取一行行文本,取消标识名称和确认代码,然后规范化文本,使数据在列中对齐。除了最后一部分,确认码前面有一个可变数量的点和一个2到4个字符长或可能丢失的包id,我几乎拥有了所有这些 'regex Dim MyRegex As Regex = New Regex("(?<pre>^\s{0,2}(\d{1,3})\s(\d\d))(.+?)(?<post>\.\.(\d{1,3}

VB2010:我正在使用正则表达式来取消识别文本块,并对文本进行规范化。也就是说,获取一行行文本,取消标识名称和确认代码,然后规范化文本,使数据在列中对齐。除了最后一部分,确认码前面有一个可变数量的点和一个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)
到目前为止,我的输出:

    '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))
我正在取消识别名称和确认代码,但确认代码之前的代码包id是可变的,因此这会中断我的列输出。有点卡在它的最后部分,但我真的很接近。我的目标是做一个正则表达式,但这可能是不可能的。是否可以填充正则表达式替换项

使用解决方案更新:

-----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.******
----------------------------------------------------------

也许有更好的方法,但是用和实现你想要的是可能的

评估器

类型:System.Text.RegularExpressions.MatchEvaluator
检查每个匹配项并返回原始匹配字符串或替换字符串的自定义方法

关键是获得第3组和第8组的长度,并重复相同次数的
*
。要添加正斜杠,我们可以通过将组3的长度除以2来找到中间
StrDup
是一个方便的函数,可以将字符串“乘以”指定的次数

下面是一个VB.NET代码:


你想要得到什么样的输出?我想你知道没有正则表达式很容易做到吗?Stribizov输出如图所示,但已排列好。现在所有的东西都排好了,除了确认码。Andrew我知道没有regex我也能做到,但是上面的数据是一个更大文档的一部分,我希望能替换掉这个部分。如果你有类似于
101********…1.a E2T的输出行……********
,第一个星号组中没有斜杠?是的,但是包id可以是2到4个字符,并且后面的点数也可以不同。我想说的是,如果正则表达式有一个填充说明符,我可以将包id填充到4个字符,这样就行了。事实上,.NET正则表达式确实有一个谓词重载,但仅用于单个/简单替换。我相当确定其目的是用固定字符串“******/****”替换任何名称,而不是用星号替换字符。安德鲁:是的,这是我的初衷,但有了这一点帮助,我认为这会起作用。让我通过一些修改来测试代码,并将其附加到原始请求中。Stribizev感谢您的提示。我不认为我曾经使用过MatchEvaluator,但肯定会将它添加到我的工具箱中。根据您的建议,我对最终解决方案进行了一些调整,以调整包id和确认代码之间的点。这是需要修改的变量,它可以工作。甚至不需要“点”组。op中的最终代码。
    '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.******
----------------------------------------------------------
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....******