3

口座番号が含まれているように見えるテキストのビットをマスクする「単純な」正規表現を考え出そうとしています。

平易な英語で:

  • 数字を含む単語 (またはそのような単語の列) が一致する必要があります
  • 最後の 4 桁はそのままにしておきます
  • 一致した文字列の前の部分をすべて 4 つの X (xxxx) に置き換えます。

ここのところ

私は以下を使用しています:

[\-0-9 ]+(?<m1>[\-0-9]{4})

で置き換える

xxxx${m1}

しかし、これは以下の最後のいくつかのサンプルを見逃しています

サンプルデータ:

123456789
a123b456
a1234b5678
a1234 b5678
111 22 3333
this is a a1234 b5678 test string

実績

xxxx6789
a123b456
a1234b5678
a1234 b5678
xxxx3333
this is a a1234 b5678 test string

予想された結果

xxxx6789
xxxxb456
xxxx5678
xxxx5678
xxxx3333
this is a xxxx5678 test string

そのような取り決めは正規表現の置き換えで可能ですか?

貪欲さと先読み機能が必要になると思いますが、それらの分野での経験はありません。

4

4 に答える 4

3

これはあなたの例で機能します:

var result = Regex.Replace(
    input,
    @"(?<!\b\w*\d\w*)(?<m1>\s?\b\w*\d\w*)+",
    m => "xxxx" + m.Value.Substring(Math.Max(0, m.Value.Length - 4)));

のような値がある場合は111 2233 33、 が出力されますxxxx3 33。これにスペースを入れないようにしたい場合は、ラムダを、値から空白を削除する複数行のステートメントに変えることができます。

正規表現パターンを少し説明すると、否定の後読みがあるため、その後ろの単語に数字が含まれていないことを確認します (数字の周りにオプションの単語文字があります)。次にm1、数字を含む単語を検索する部分があります。この最後の 4 文字は、正規表現パターンが残りを解決した後、いくつかの C# コードを介して取得されます。

于 2013-11-04T19:41:54.323 に答える
2

これを試しましたか:

.*(?<m1>[\d]{4})(?<m2>.*)

交換品付き

xxxx${m1}${m2}

これにより、

xxxx6789
xxxx5678
xxxx5678
xxxx3333
xxxx5678 test string

「a123b456」を一致させることはできません...「b」が数値になるまで。;-)

于 2013-11-04T19:38:42.147 に答える
2

正規表現がこの問題を解決する最良の方法であるとは思わないため、この回答を投稿しています。非常に複雑な状況では、対応する正規表現を構築することは非常に困難であり、さらに悪いことに、その明確さと適応性は、より長いコードのアプローチよりもはるかに低くなります。

これらの行の下のコードは、目的の機能を正確に提供します。十分に明確であり、簡単に拡張できます。

string input = "this is a a1234 b5678 test string";
string output = "";
string[] temp = input.Trim().Split(' ');
bool previousNum = false;
string tempOutput = "";
foreach (string word in temp)
{
    if (word.ToCharArray().Where(x => char.IsDigit(x)).Count() > 0)
    {
        previousNum = true;
        tempOutput = tempOutput + word;
    }
    else
    {
        if (previousNum)
        {
            if (tempOutput.Length >= 4) tempOutput = "xxxx" + tempOutput.Substring(tempOutput.Length - 4, 4);
            output = output + " " + tempOutput;
            previousNum = false;
        }
        output = output + " " + word;
    }
}
if (previousNum)
{
    if (tempOutput.Length >= 4) tempOutput = "xxxx" + tempOutput.Substring(tempOutput.Length - 4, 4);
    output = output + " " + tempOutput;
    previousNum = false;
}
于 2013-11-04T19:59:14.160 に答える