Добавить 10000 к числам с помощью Regex replace?

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

Photo.123.aspx

должен стать

Photo.10123.aspx

а также

Photo.12.aspx

должен стать

Photo.10012.aspx

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 703
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Я должен был бы согласиться до некоторой степени, хотя в зависимости от обстоятельств Regex'ing это неплохое решение ...

wprl 24.10.2008 19:16

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

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

Herb Caudill 24.10.2008 19:09

Если это только двух- или трехзначные числа:

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

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

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

Затем проверьте: Photo\.{\d\d}\.aspx

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

Кажется, это делает то, что вы хотите:

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

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

Herb Caudill 24.10.2008 19:30

нет никакого волшебства регулярных выражений, чтобы делать математику, это только для манипуляции строками

Nick Berardi 24.10.2008 19:38

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

Perl

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

TIMTOWTDI (есть несколько способов сделать это)

Brad Gilbert 27.10.2008 02:36

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

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

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

Я вижу, как это происходит только так.

Вот как я бы это сделал, если вы не можете написать это на Perl.

Brad Gilbert 27.10.2008 02:32

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

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

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

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме