使用正则表达式替换为数字添加10000?

时间:2008-10-24 15:00:35

标签: vb.net regex

我需要用相同的数字加10000来替换一些2位和3位数字。所以

Photo.123.aspx

需要成为

Photo.10123.aspx

以及

Photo.12.aspx

需要成为

Photo.10012.aspx

我知道在.NET中我可以将替换委托给一个函数,只需要为该数字添加10000,但如果可以的话,我宁愿坚持使用花园种类的RegEx。有什么想法吗?

10 个答案:

答案 0 :(得分:6)

我认为使用RegEx进行匹配,并且替换函数最适合在这种情况下,你正在做简单的数学运算,使用专门设计的东西......

答案 1 :(得分:6)

詹姆斯是对的,你想使用带有MatchEvaluator参数的Regex.Replace方法。您可以在匹配评估程序委托中获取匹配中获得的数字字符串,并将其转换为可以添加10,000的数字。我使用lambda表达式代替显式委托,因为它更紧凑和可读。

using System;
using System.Text.RegularExpressions;

namespace RenameAspxFile
{
    sealed class Program
    {
        private static readonly Regex _aspxFileNameRegex = new Regex(@"(\S+\.)(\d+)(\.aspx)", RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
        private static readonly string[] _aspxFileNames= {"Photo.123.aspx", "Photo.456.aspx", "BigPhoto.789.aspx"};

        static void Main(string[] args)
        {
            Program program = new Program();
            program.Run();
        }

        void Run()
        {
            foreach (string aspxFileName in _aspxFileNames)
            {
                Console.WriteLine("Renamed '{0}' to '{1}'", aspxFileName, AddTenThousandToPhotoNumber(aspxFileName));
            }
        }

        string AddTenThousandToPhotoNumber(string aspxFileName)
        {
            return _aspxFileNameRegex.Replace(aspxFileName, match => String.Format("{0}{1}{2}", match.Result("$1"), Int32.Parse(match.Result("$2")) + 10000, match.Result("$3")));
        }
    }
}

答案 2 :(得分:5)

是否有任何理由必须VB.NET

的Perl

s(
  Photo\. (\d{2,3}) \.aspx
){
  "Photo." . ($1 + 10000) . ".aspx"
}xe

答案 3 :(得分:2)

尝试以下方法:

"Photo\./d\.aspx" and replace with "Photo.1000$1.aspx"
"Photo\./d/d\.aspx" and replace with "Photo.100$1.aspx"
"Photo\./d/d/d\.aspx" and replace with "Photo.10$1.aspx"

这是我看到这种情况发生的唯一方式。

答案 4 :(得分:1)

如果它只有两位或三位数字:

(我假设您使用的是.NET Regex,因为我们讨论的是.aspx文件)

检查:Photo\.{\d\d\d}\.aspx

替换为:Photo.10\1.aspx

然后检查:Photo\.{\d\d}\.aspx

替换为:Photo.100\1.aspx

答案 5 :(得分:1)

James Curran做得比我快一点,但这里就是我对你的好处。认为这是你可以用Regex做你想做的最小代码。

        Regex          regex = new Regex(@"(\d\d\d?)", RegexOptions.None);
        string result = regex.Replace(@"Photo.123.asp", delegate(Match m) 
                                                {
                                                    return "Photo.1"
                                                        + m.Groups[1].Captures[0].Value.PadLeft(4, '0')
                                                        + ".aspx";
                                                }
        );

答案 6 :(得分:0)

您是否尝试使用PadLeft

答案 7 :(得分:0)

这似乎可以满足您的需求:

static public string Evaluator(Match match) 
{
     return "Photo.1" 
            + match.Groups[1].Captures[0].Value.PadLeft(4, '0')
            + ".aspx";
}

public void Code(params string[] args)
{
     string pattern = @"Photo\.([\d]+)\.aspx";
     string test = "Photo.123.aspx";
     Regex regex = new Regex(pattern);
     string converted = regex.Replace(test, Evaluator) 
     Console.WriteLine(converted);
}

答案 8 :(得分:0)

这将匹配字符串的右侧部分,但不会告诉您它是两位数还是三位数。

[^\d][\d]{2,3}[^\d]

不过,您可以使用它来获取数字,将其转换为int,添加10000,并将其转换为您需要的字符串。

答案 9 :(得分:0)

发现这个问题,因为我试图在Vim做类似的事情。 我把解决方案放在这里。

:s/Photo\.\d\+\.aspx/\=Photo\.submatch(0)+10000\.aspx/g