使用REGEX的可变长度零的填充号

时间:2018-02-20 17:48:24

标签: .net regex formatting

我遇到客户输入数字的情况,我需要通过在其前面填充一定数量的零来验证该数字。我验证的字段的最大长度为9位,因此如果客户端输入' 123',我需要在其前面填充6个零并验证。听起来很容易,对吗?

嗯,这是踢球者,我对进程的任何部分都没有代码控制权。我唯一可用的东西是2'属性' - 正则表达式模式和正则表达式替换现有代码用于处理输入的内容。

那么,是否可以使用带有正则表达式替换的正则表达式模式填充输入?同样,我无法访问代码,因此我无法应用此Pad left with zeroes

等解决方案

我能做的是定义一个已经存在的代码正在使用的搜索模式和替换模式。

以下是我要找的内容:

INPUT       OUTPUT
1           000000001
12          000000012
123         000000123
12345678    012345678
123456789   123456789

目前我所拥有的模式是:

([0-9]{1,9})

和替换:

000000000$1

但它没有完成我需要的工作,它在输入前面添加了固定数量的零,而不是可变数字。考虑到我的工作限制,我怀疑这项任务是不可能的,但无论如何我还是想问。

PS:读取正则表达式的代码的语言是.NET(C#)

编辑1:重申一下,我无法以任何方式更改/更改代码,我甚至无法看到它。我认为这是现有代码的作用:

  Regex rgx = new Regex(pattern);
  string result = rgx.Replace(input, replacement);

patternreplacement是从配置文件中读取的字符串,我可以更改这两个字符串的值。就是这样。我不能改变读取它的代码,也不能将它循环到正则表达式两次或任何东西。

编辑2: 不完全是我正在寻找的东西,但是(VB.NET代码):

Dim result As String = Regex.Replace(input, pattern, Function(match As Match)
                                                         Dim v As String = match.ToString()
                                                         Return String.Format("{0:000000000}", Val(v))
                                                     End Function)

问题是,Function是代码,但如果我将其粘贴到属性中,它将被读作字符串,不会作为代码执行,而是作为替换字符串执行。如果我只能弄清楚如何将该字符串视为代码,那将解决我的问题。

编辑3: 来自EDIT 2的优化代码(这次是在C#中):

var result = Regex.Replace(input, pattern, (v) => string.Format("{0:000000000}", double.Parse(v.Value)));

仍然无法弄清楚如何在不更改服务器上的代码(我无权访问)的情况下执行这段代码(v) => string.Format("{0:000000000}", double.Parse(v.Value)),因为它存储为字符串。没有访问服务器上的更改代码就感觉不可能。

编辑4: 看看执行正则表达式的服务器代码:

searchVal = Regex.Replace(accountNumber, pattern, replace);

"无法改变代码"限制仍然适用,所以我之前编辑的建议仍然无法访问,因为它被视为字符串而不是代码。鉴于我正在进行的限制,我认为这是一项不可能完成的任务。

感谢所有试图提供帮助的人

1 个答案:

答案 0 :(得分:1)

如你所说,.PadLeft()确实是这样做的方法,但你提到你不能使用它。不幸的是,C#不支持正则表达式的条件替换。我认为最简单的选择是创建8个不同的正则表达式:

\b([1-9])\b            00000000$1
\b([1-9]\d)\b          0000000$1
\b([1-9]\d{2})\b       000000$1
\b([1-9]\d{3})\b       00000$1
\b([1-9]\d{4})\b       0000$1
\b([1-9]\d{5})\b       000$1
\b([1-9]\d{6})\b       00$1
\b([1-9]\d{7})\b       0$1

或者,可以在一个正则表达式中完成所有这些,但是您需要在输入中附加字典,如下所示:

See it in use here

^([1-9](?=.*1\t+(?<x>0+))|[1-9]\d(?=.*2\t+(?<x>0+))|[1-9]\d{2}(?=.*3\t+(?<x>0+))|[1-9]\d{3}(?=.*4\t+(?<x>0+))|[1-9]\d{4}(?=.*5\t+(?<x>0+))|[1-9]\d{5}(?=.*6\t+(?<x>0+))|[1-9]\d{6}(?=.*7\t+(?<x>0+))|[1-9]\d{7}(?=.*8\t+(?<x>0+)))\b

附加以下内容(请注意,SO显示空格,但数字由制表符分隔):

1   00000000
2   0000000
3   000000
4   00000
5   0000
6   000
7   00
8   0

替换:${x}$1

如何添加字典?好吧,如果你有能力将它附加到输入,这是最简单的选择。否则,使用正则表达式可以使用\z as seen here。然后,您必须运行上面的正则表达式才能使用字典。

替换:\n1\t00000000\n2\t0000000\n3\t000000\n4\t00000\n5\t0000\n6\t000\n7\t00\n8\t0

如果您无法在单个输入上运行多个正则表达式,我担心您尝试完成的操作无法完成,因为每个方法至少需要在输入上运行2次给你预期的输出。