Vb.net 使用Regex replace向数字添加10000?
我需要用相同的数字加10000替换一些2位和3位数字。所以Vb.net 使用Regex replace向数字添加10000?,vb.net,regex,Vb.net,Regex,我需要用相同的数字加10000替换一些2位和3位数字。所以 Photo.123.aspx 需要成为 Photo.10123.aspx Photo.10012.aspx 而且 Photo.12.aspx 需要成为 Photo.10123.aspx Photo.10012.aspx 我知道在.NET中,我可以将替换委托给一个函数,只需在数字上加10000,但如果可以的话,我宁愿选择garden variety RegEx。有什么想法吗?我认为使用正则表达式进行匹配,并使用函数进行替换是最
Photo.123.aspx
需要成为
Photo.10123.aspx
Photo.10012.aspx
而且
Photo.12.aspx
需要成为
Photo.10123.aspx
Photo.10012.aspx
我知道在.NET中,我可以将替换委托给一个函数,只需在数字上加10000,但如果可以的话,我宁愿选择garden variety RegEx。有什么想法吗?我认为使用正则表达式进行匹配,并使用函数进行替换是最合适的。在这种情况下,您正在做简单的数学运算,使用一些专门设计的方法来实现它….您是否尝试过使用?如果只有两位或三位数字: (我假设您使用的是.NET正则表达式,因为我们讨论的是.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 Perl
詹姆斯·科伦做得比我快一点,但这是我为你准备的。认为这是你可以用正则表达式来做你想做的事情的最小代码
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"
这是我看到这种情况的唯一方式。这将匹配字符串的右侧部分,但不会告诉您是两位数还是三位数
[^\d][\d]{2,3}[^\d]
尽管如此,您仍然可以使用它获取数字,将其转换为int,添加10000,然后将其转换为所需的字符串。James说得对,您希望使用带有MatchEvaluator参数的Regex.Replace方法。match evaluator委托用于获取匹配中获得的数字字符串,并将其转换为可添加10000的数字。我使用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")));
}
}
}
发现这个问题,因为我试图在Vim中执行类似的操作。 我把解决办法放在这里
:s/Photo\.\d\+\.aspx/\=Photo\.submatch(0)+10000\.aspx/g
正如我所说,我正试图在正则表达式中实现这一点。如果我要写一个函数来实现它,我只会做简单的算术运算,而不是字符串操作。我必须在某种程度上同意,尽管这取决于使用正则表达式的情况,这不是一个糟糕的解决方案……如果我要连接一个计算器,我最好只使用简单的算术运算,而不是字符串操作。我希望有一些只使用正则表达式的巫术。没有任何正则表达式巫术来做数学运算,它只用于字符串操作。如果不能用Perl.TIMTOWTDI编写,我会这样做(有多种方法可以做到)