只有当数字超过两位时,正则表达式才能将数字与空格分开

时间:2016-01-30 16:05:46

标签: c# regex

我有一些包含字母数字字符的字符串,例如:

10
1234
123-t123b-+1
ff 8765 12

我想用空格分隔数字,但前提是彼此相邻有三位或更多位数。所以上面的例子将成为:

10
1_2_3_4
1_2_3-t1_2_3b-+1
ff 8_7_6_5 12

(为了清晰起见,添加了带有下划线的空格)。是否有可以处理此问题的正则表达式,还是我需要以编程方式执行此操作?

4 个答案:

答案 0 :(得分:3)

我认为你需要这样的东西:

var text = "10" + Environment.NewLine + 
           "1234" + Environment.NewLine + 
           "123-t123b-+1" + Environment.NewLine + 
           "ff 8765 12";

var regex = new Regex(@"\d{3,}");
var replacedText = regex.Replace(text, match => string.Join<char>(" ", match.Value));

答案 1 :(得分:0)

不确定C#是否支持\G但尝试此模式

\B(?=\d{2})|(?<!^)\G(?=\d)

Demo

这是我的第二种模式,没有使用\G

(?<=\d)(?=\d\d)|(?<=\d\d)(?=\d)

Demo
解释:

(?<=\d)(?=\d\d)     # 0-width after 1 digit and before 2 digits ie 1^234 or 12^34  
|                   # or  
(?<=\d\d)(?=\d)     # 0-width after 2 digits and before 1 digit ie 12^34 or 123^4

答案 2 :(得分:0)

我想出了这个

匹配任意数字后跟两个数字,第二个数字必须后跟至少一个数字和之后的任何数字

更新:我的模式可以缩短为:(\d(?=\d{2})\d+)

class Program
{
    static void Main(string[] args)
    {

        string pattern = @"(\d(?=\d{2})\d(?=\d)\d+)";
        string content = "10" + Environment.NewLine +
                         "1234" + Environment.NewLine +
                         "123 - t123b - +1" + Environment.NewLine +
                         "ff 8765 12";

        var reg = new Regex(pattern);
        var replacedText = reg.Replace(content, match => string.Join<char>(" ", match.Value));

        Console.WriteLine(replacedText);

        Console.ReadLine();
    }


}

答案 3 :(得分:0)

到目前为止,使用纯正则表达式我已经成功找到位置并替换为space,除非最后一位数后跟whitespace。这是我的解决方案,虽然接近但是达到了标准。如果您希望 downvote ,请在解决方案方面提供一些建议。

正则表达式#1 (?<=\d)(?=(\d)(?=\d|.))

解释:它通过查找前面有数字并后跟数字的位置(零宽度)来放置正则表达式指针后期数字右一个)后面应跟一个数字或whitespaces以外的任何数字。

Regex101 Demo#1

正则表达式#2 (?<=\d)(?=(\d|\w)(?=\d|.))

解释:这个有一点变化。它通过找到一个以数字开头的位置(零宽度)并后跟一个数字或除whitespaces以外的任何其他位置来放置正则表达式指针

Regex101 Demo #2

现在唯一的问题是匹配whitespaces后跟有效案例。