.NET Regex取代组内的字符

时间:2012-12-05 11:30:49

标签: .net regex replace

我使用正则表达式替换(在.Net应用程序中)从条形码创建项目ID。这是我正在使用的正则表达式:

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

替换字符串是(它有前导空格,但这并不重要):

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

示例输入是:

685774010M00555P002

上述替换的当前结果是:

685774010 002

但是现在我的客户希望我删除群组中的前导零&#34; Pos&#34;和&#34; Lfd&#34;,所以结果应改为:

685774 10   2

编辑:请注意&#34; lfd&#34;中的两个零。组被两个空格取代!

我已经尝试了几个小时了,但我似乎无法让这个工作。我能找到的最佳方法是为前导零创建额外的组,如:

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

但我不知道如何更换&#34; null组&#34;正确的空白数量。这有可能吗? (到现在为止,我觉得Regex并没有什么不可能; - )

有人可以帮忙吗?

3 个答案:

答案 0 :(得分: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]指的是整场比赛

答案 1 :(得分: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"," "));

答案 2 :(得分:0)

好的,找到了符合我需求的解决方案。它是用一个简单的String.Format完成的,将正则表达式的组转换为整数。组由索引访问,但由于它是在格式字符串中完成的,因此不需要硬编码。

以下是代码:

// 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);
}

备注:

  • 跳过(1)是必要的,因为集合中的第一个组本身就是完全匹配。
  • 需要强制转换为对象,因为string.format需要一个params对象[]数组,并且无法使用int []