我使用正则表达式替换(在.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并没有什么不可能; - )
有人可以帮忙吗?
答案 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
!
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);
}
备注: