正则表达式仅在超过两位数字时才用空格分隔数字

本文关键字:数字 两位 分隔 空格 正则表达式 | 更新日期: 2023-09-27 18:32:36

>我有许多包含字母数字字符混合的字符串,例如:

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

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

正则表达式仅在超过两位数字时才用空格分隔数字

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

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

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

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

演示


这是我不使用'G的第二种模式

(?<='d)(?='d'd)|(?<='d'd)(?='d)

演示
解释:

(?<='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

我想出了这个

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

更新:我的模式可以缩短为:('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();
    }

}

到目前为止,使用纯正则表达式,我已经成功地找到了位置并替换为space,除非最后一个数字后跟一个whitespace。这是我的解决方案,它很接近但符合标准。如果您希望投反对票,请提供一些解决方案方向的建议。

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

说明:它通过查找一个位置(零宽度(来放置正则表达式指针,该位置前面是一个数字,后跟一个数字。一个数字(右边一个(后面应该跟一个数字或除whitespaces以外的任何数字。

正则表达式101 演示#1


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

说明:这个有一点变化。它通过查找一个位置(零宽度(来放置正则表达式指针,该位置前面是一个数字,后跟一个数字或除whitespaces以外的任何内容。

正则表达式101演示 #2

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