【问题标题】:Pad left with zeroes用零向左填充
【发布时间】:2012-08-07 17:45:22
【问题描述】:

我想在我的字符串中用零(必须是 8 位)向左填充每个数字。

例如

asd 123 rete > asd 00000123 rete
4444 my text > 00004444 my text

是否可以使用正则表达式来做到这一点?特别是Regex.Replace()

请注意,对于不同的数字,零的数量是不同的。我的意思是填充的数字必须是 8 位长。

【问题讨论】:

  • 来吧...稍微谷歌搜索不会有什么坏处,你不需要正则表达式:msdn.microsoft.com/en-us/library/66f6d830%28VS.71%29.aspx
  • 是的,我知道 PadLeft() 方法,但问题是我有一个字符串,里面有一些奇怪的词,我只想给数字加零(你可以注意到这些数字零对于不同的数字是不同的)。我可以使用 Regex 查找所有数字并检查其长度,但我想知道是否可以使用 Replace() 更轻松地做到这一点?
  • 不,你被否决了,因为你没有有效地沟通。如果多人无法理解您,那么您有责任让自己更好地理解。

标签: c# regex


【解决方案1】:

微软为此内置了函数:

someString = someString.PadLeft(8, '0');

还有一篇关于MSDN的文章

要使用正则表达式,请执行以下操作:

string someText = "asd 123 rete"; 
someText = Regex.Replace(someText, @"\d+", n => n.Value.PadLeft(8, '0'));

【讨论】:

  • 我问了一些不同的问题:P 我不想将我的字符串拆分成一个数组来填充左边的块。我想用正则表达式在一行中做到这一点;)
  • 这根本不执行任何拆分。
  • 您也可以使用 PadRight 方法通过在字符串右侧添加特殊字符来固定字符串的长度。
【解决方案2】:

线程很旧,但也许有人需要这个。

Nickon 表示他想使用正则表达式。为什么?没关系,也许它很有趣。我必须在 SQL 中进行内联替换,所以一些调用 C# 正则表达式的自制 SQL 函数很有帮助。

我需要填充的东西看起来像这样:

abc 1.1.1
abc 1.2.1
abc 1.10.1

我想要:

abc 001.001.001
abc 001.002.001
abc 001.010.001

所以我可以按字母顺序排序。

到目前为止(我找到的)唯一的解决方案是分两步进行填充和截断到正确的长度。我不能使用 Lambda,因为它是在 SQL 中,而且我还没有为此准备好我的函数。

//This pads any numbers and truncates it to a length of 8
var unpaddedData = "...";
var paddedData = Regex.Replace(unpaddedData , "(?<=[^\d])(?<digits>\d+)",
                                                     "0000000${digits}");
var zeroPaddedDataOfRightLength = Regex.Replace(paddedData ,"\d+(?=\d{8})","");

解释:

(?<=[^\d])(?<digits>\d+)
(?<=[^\d])       Look behind for any non digit, this is needed if there are 
                 more groups of numbers that needs to be padded
(?<digits>\d+)   Find the numbers and put them in a group named digits to be 
                 used in the replacement pattern

0000000${digits} Pads all the digits matches with 7 zeros

\d+(?=\d{8})     Finds all digits that are followed by at exactly 8 digits. 
                 ?= Doesn't capture the 8 digits.

Regex.Replace(...,"\d+(?=\d{8})","")   
                 Replaces the leading digits with nothing leaving the last 8.

【讨论】:

    【解决方案3】:

    如果您没有任何正则表达式附件,请使用格式字符串:

    C# convert int to string with padding zeros?

    http://www.xtremedotnettalk.com/showthread.php?t=101461

    【讨论】:

    • 这里一样,查看我的评论
    【解决方案4】:
    static void Main(string[] args)
        {
           string myCC = "4556364607935616";
           string myMasked = Maskify(myCC);
           Console.WriteLine(myMasked);
        }        
    
    public static string Maskify(string cc)
        {
           int len = cc.Length;
           if (len <= 4)
              return cc;
    
           return cc.Substring(len - 4).PadLeft(len, '#');
        }
    

    输出:

    ######5616

    只需将“#”替换为 0 或“0”即可。 希望有所帮助:)

    【讨论】:

    • 欢迎来到 Stack Overflow,感谢您回答问题。但答案应该回答问题。这里的问题并没有要求用其他东西替换高位数字。
    • 非常感谢您的反馈。下次我会更准确。这是我的第一个贡献,我一直想加入这个伟大的社区。很高兴能够帮助回馈对这个社区表示感谢。谢谢!
    • 为了更好地了解本网站,请访问tour,然后阅读help center 的一些页面。