Добавить 10000 к числам с помощью Regex заменить? - PullRequest
2 голосов
/ 24 октября 2008

Мне нужно заменить несколько 2- и 3-значных чисел на одно и то же число плюс 10000. Так что

Photo.123.aspx

должно стать

Photo.10123.aspx

, а также

Photo.12.aspx

должно стать

Photo.10012.aspx

Я знаю, что в .NET я могу делегировать замену функции и просто добавить 10000 к числу, но я бы предпочел придерживаться RegEx для сада, если смогу. Есть идеи?

Ответы [ 10 ]

6 голосов
/ 24 октября 2008

Я думаю, что использование RegEx для соответствия и функции для замены является наиболее подходящим в этом случае, вы делаете простую математику, используете что-то, что предназначено для этого .....

6 голосов
/ 24 октября 2008

Джеймс прав, что вы хотите использовать метод Regex.Replace, который принимает аргумент MatchEvaluator. Делегат оценщика совпадений - это место, где вы можете взять числовую строку, полученную в совпадении, и преобразовать ее в число, к которому вы можете добавить 10000. Я использовал лямбда-выражение вместо явного делегата, потому что оно более компактно и читабельно.

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")));
        }
    }
}
5 голосов
/ 24 октября 2008

Есть ли причина, по которой оно должно быть VB.NET?

Perl

s(
  Photo\. (\d{2,3}) \.aspx
){
  "Photo." . ($1 + 10000) . ".aspx"
}xe
2 голосов
/ 24 октября 2008

Попробуйте следующее:

"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"

Это единственный способ увидеть это.

1 голос
/ 24 октября 2008

Джеймс Керран сделал это немного быстрее меня, но хорошо, вот что у меня есть для вас. Подумайте, это самый маленький код, который вы можете иметь с 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";
                                                }
        );
1 голос
/ 24 октября 2008

Если это только две или три цифры:

(я предполагаю, что вы используете .NET Regex, поскольку речь идет о файлах .aspx)

Проверить: Photo\.{\d\d\d}\.aspx

Заменить на: Photo.10\1.aspx

Затем сравните с: Photo\.{\d\d}\.aspx

Заменить на: Photo.100\1.aspx

0 голосов
/ 02 августа 2010

Нашел этот вопрос, так как я пытался сделать что-то подобное в Vim. Я поставлю решение здесь.

:s/Photo\.\d\+\.aspx/\=Photo\.submatch(0)+10000\.aspx/g
0 голосов
/ 24 октября 2008

Это будет соответствовать правой части строки, но не скажет вам, если это две цифры или три.

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

Тем не менее, вы можете использовать это, чтобы получить число, преобразовать его в целое число, добавить 10000 и преобразовать его в нужную вам строку.

0 голосов
/ 24 октября 2008

Это похоже на то, что вы хотите:

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);
}
0 голосов
/ 24 октября 2008

Вы пытались просто использовать PadLeft ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...