Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用Regex replace向数字添加10000?_Vb.net_Regex - Fatal编程技术网

Vb.net 使用Regex replace向数字添加10000?

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。有什么想法吗?我认为使用正则表达式进行匹配,并使用函数进行替换是最

我需要用相同的数字加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。有什么想法吗?

我认为使用正则表达式进行匹配,并使用函数进行替换是最合适的。在这种情况下,您正在做简单的数学运算,使用一些专门设计的方法来实现它….

您是否尝试过使用?

如果只有两位或三位数字:

(我假设您使用的是.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编写,我会这样做(有多种方法可以做到)