我需要用相同的数字加10000来替换一些2位和3位数字。所以
Photo.123.aspx
需要成为
Photo.10123.aspx
以及
Photo.12.aspx
需要成为
Photo.10012.aspx
我知道在.NET中我可以将替换委托给一个函数,只需要为该数字添加10000,但如果可以的话,我宁愿坚持使用花园种类的RegEx。有什么想法吗?
答案 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
?
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