1

VB2010: RegEx を使用してテキスト ブロックを非識別化し、テキストを正規化しています。つまり、テキスト行を取得して名前と確認コードを非識別化し、テキストを正規化して、データが列に並ぶようにします。確認コードの前にさまざまな数のドットがあり、パッケージ ID が 2 ~ 4 文字の長さであるか、欠落している可能性がある最後の部分を除いて、ほとんどすべてを持っています。

    '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 が可変であるため、列の出力が失われています。それの端の部分にちょっと立ち往生していますが、本当に近いです。私はそれを1つの正規表現で行うことを目指していますが、それは不可能かもしれません. 正規表現の置換をパディングすることは可能ですか?

ソリューションで更新します。

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

1 に答える 1

1

おそらく、もっと良い方法があるかもしれませんが正規表現と.Regex.ReplaceMatchEvaluator

evaluator
型: System.Text.RegularExpressions.MatchEvaluator
各一致を調べて、一致した元の文字列または置換文字列を返すカスタム メソッド。

ポイントは、グループ 3 とグループ 8 の長さを取得し*、同じ回数繰り返すことです。スラッシュを追加するには、グループ 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....******
于 2015-10-23T21:31:17.077 に答える