Мне нужно заменить некоторые 2- и 3-значные числа на то же число плюс 10000. Итак
Photo.123.aspx
должен стать
Photo.10123.aspx
а также
Photo.12.aspx
должен стать
Photo.10012.aspx
Я знаю, что в .NET я могу делегировать замену функции и просто добавить к числу 10000, но я бы предпочел придерживаться разнообразных RegEx, если это возможно. Есть идеи?





Я думаю, что использование RegEx для сопоставления и функции для замены является наиболее подходящим в этом случае, вы делаете простую математику, используйте что-то, что предназначено для этого ...
вы пробовали просто использовать PadLeft?
Как я уже сказал, я пытаюсь сделать это в RegEx. Если я собираюсь написать функцию для этого, я буду просто выполнять простую арифметику, а не манипулировать строками.
Если это только двух- или трехзначные числа:
(Я предполагаю, что вы используете .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);
}
Если я собираюсь подключить оценщик, я мог бы просто использовать простую арифметику, а не манипуляции со строками. Я надеялся на волшебство только с регулярными выражениями.
нет никакого волшебства регулярных выражений, чтобы делать математику, это только для манипуляции строками
Есть ли причина, по которой это должен быть VB.NET?
s(
Photo\. (\d{2,3}) \.aspx
){
"Photo." . ($1 + 10000) . ".aspx"
}xe
TIMTOWTDI (есть несколько способов сделать это)
Джеймс Карран сделал это немного быстрее меня, но вот что у меня есть для вас. Подумайте, что это наименьший код, который вы можете иметь с 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.
Это будет соответствовать правой части строки, но не скажет вам, две цифры это или три.
[^\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
Я должен был бы согласиться до некоторой степени, хотя в зависимости от обстоятельств Regex'ing это неплохое решение ...