3

(.Netアプリケーションで)正規表現replaceを使用して、バーコードからアイテムIDを作成しています。これが私が使用している正規表現です:

^(?<Bestellnr>\w{6})(?<Pos>\d{3})M(?<Menge>\d{5})P(?<Lfd>\d{3})$

置換文字列は次のとおりです(先頭に空白がありますが、ここでは重要ではありません)。

${Bestellnr}${Pos} ${Lfd}

入力例は次のとおりです。

685774010M00555P002

上記の交換の現在の結果は次のとおりです。

685774010 002

しかし今、私の顧客は、グループ「Pos」と「Lfd」から先行ゼロを削除することを望んでいるので、結果は次のように変わるはずです。

685774 10   2

編集: 「lfd」グループの2つのゼロが2つのブランクに置き換えられていること注意してください!

私は今何時間も試しましたが、これを機能させることができないようです。私が見つけた最善のアプローチは、次のような先行ゼロ用の追加のグループを作成することでした。

^(?<Bestellnr>\w{6})(?<PosNull>0*)(?<Pos>\d{1,})M(?<Menge>\d{5})P(?<LfdNull>0*)(?<Lfd>\d{1,})$

しかし、「ヌルグループ」を正しい数のブランクに置き換える方法がわかりません。これは可能ですか?(今まで、正規表現で不可能なことは何もないと思っていました;-)

誰か助けてもらえますか?

4

3 に答える 3

2

これを試して:

string input = "685774010M00555P002";

input = Regex.Replace(input, 
    @"^(?<Bestellnr>\w{6})0*(?<Pos>\d{1,3})M(?<Menge>\d{5})P0*(?<Lfd>\d{1,3})$", 
    m => m.Groups["Bestellnr"].Value + 
         m.Groups["Pos"].Value.PadLeft(3, ' ') + 
         m.Groups["Lfd"].Value.PadLeft(4, ' '));

結果:

input = "685774 10   2"

編集: 以前と同じ正規表現を維持しましたが、置換を変更しました

別の編集:

グループ名を完全に削除して、番号で参照することができます。

input = Regex.Replace(input, 
@"^(\w{6})0*(\d{1,3})M(\d{5})P0*(\d{1,3})$", 
m => m.Groups[1].Value + 
     m.Groups[2].Value.PadLeft(3, ' ') + 
     m.Groups[4].Value.PadLeft(4, ' '));

注:m.Groups[0]一致全体を指します

于 2012-12-05T11:46:31.837 に答える
2

matchevaluator!を使用して 0 をスペースに置き換えることで実行できます。

Regex.Replace("685774010M00555P002",
@"^(?<Bestellnr>\w{6})(?<Pos>\d{3})M(?<Menge>\d{5})P(?<Lfd>\d{3})$",
m=>m.Groups["Bestellnr"].Value+""+
   Regex.Replace(m.Groups["Pos"].Value,"(?<=^0*)0"," ")+
   " "+
   Regex.Replace(m.Groups["Lfd"].Value,"(?<=^0*)0"," "));
于 2012-12-05T11:56:20.213 に答える
0

わかりました、私のニーズに合ったソリューションを見つけました。これは単純な String.Format で行われ、int に変換された正規表現のグループが渡されます。グループはインデックスによってアクセスされますが、フォーマット文字列で行われるため、ハードコーディングは必要ありません。

コードは次のとおりです。

// both from app.config
Regex regex = new Regex(@"(?<Bestellnr>\w{6})(?<Pos>\d{3})M(?<Menge>\d{5})P(?<Lfd>\d{3})");
string format = "   {0,6:d}{1,3:d} {3,3:d}";    

string barcode = "685774010M00555P002";

Match match = regex.Match(barcode);
if (match.Success)
{
    var groups = (from Group grp in match.Groups select grp.Value).Skip(1).Select(x => (object)int.Parse(x)).ToArray();
    string s = string.Format(format, groups);
    Console.WriteLine(s);
}

備考:

  • コレクション内の最初のグループは完全に一致するため、Skip(1) が必要です。
  • string.format には params object[] 配列が必要で、int[] では機能しないため、object へのキャストが必要です。
于 2012-12-06T14:48:50.153 に答える