Replace 如何替换代码中的字符串

Replace 如何替换代码中的字符串,replace,Replace,我想通过遵循一些规则对项目执行批量替换操作。例如,我在代码中做如下记录: 在每个代码段(注释如下)上,我希望执行替换操作,在以下示例中,该操作将用输出代码段替换输入代码段: 输入1: //+ a++; //+(+SomeException$SomeMessage) try { a++; } catch (AnException) { throw; } catch (Exception ex) { throw new SomeException("SomeMessage"

我想通过遵循一些规则对项目执行批量替换操作。例如,我在代码中做如下记录:

在每个代码段(注释如下)上,我希望执行替换操作,在以下示例中,该操作将用输出代码段替换输入代码段:

输入1:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
输出1:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
输入2:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
输出2:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
输入3:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
输出3:

//+
a++;
//+(+SomeException$SomeMessage)
try
{
    a++;
}
catch (AnException)
{
    throw;
}
catch (Exception ex)
{
    throw new SomeException("SomeMessage", "15", ex);
}
//+
a++;
//-(+InvalidOperationException$SomeMessage)
try
{
    a++;
}
catch (InvalidOperationException ex)
{
    throw new AnException("SomeMessage", "16", ex);
}
//+
a++;
//-(SomeMessage)
try
{
    a++;
}
catch (Exception ex)
{
    throw new AnException("SomeMessage", "17", ex);
}
对于这样注释的每个代码段,神奇的数字(15、16、17)都会增加。我知道这不是最好的做法,但我不是在做决定,我希望我能处理这样的例外情况,所以我想我可以通过做笔记和最终批量替换来减轻痛苦。最好的方法是什么?我是否应该编写自己的代码来执行替换,或者是否有一些regex替换工具或类似的工具可以自动为我执行替换


更新:这是一份一次性工作,我的魔法号码必须是全球唯一的。因此,如果一个文件中的最后一个匹配是25,那么下一个文件中的第一个匹配必须是26。

这看起来像一种简单的语言,您将编译成另一种类似Java的语言。对于这样的工作,编译器是合适的工具,特别是因为您需要保持当前幻数的状态。似乎做出决定的人都希望为该语言添加新功能,在这种情况下,与正则表达式粘在一起的解决方案可能无法正常工作

如果我对您真正想要的东西的看法是正确的,那么您的问题就可以归结为“如何编写特定于域的语言?”我不确定最好的方法是什么,但是如果您知道Perl,您可能可以用它来组合一个解决方案


我认为可以用脚本和正则表达式来实现这一点,但这正是编译器发明的问题类型。如果你最终做出了一些令人讨厌的东西,上帝会帮助在你之后必须维护它的人

这看起来像是一种简单的语言,您将编译成另一种类似Java的语言。对于这样的工作,编译器是合适的工具,特别是因为您需要保持当前幻数的状态。似乎做出决定的人都希望为该语言添加新功能,在这种情况下,与正则表达式粘在一起的解决方案可能无法正常工作

如果我对您真正想要的东西的看法是正确的,那么您的问题就可以归结为“如何编写特定于域的语言?”我不确定最好的方法是什么,但是如果您知道Perl,您可能可以用它来组合一个解决方案


我认为可以用脚本和正则表达式来实现这一点,但这正是编译器发明的问题类型。如果你最终做出了一些令人讨厌的东西,上帝会帮助在你之后必须维护它的人

您可以编写一个模板来读取该输入并输出该输出。但是,我不确定你能否在线完成。也就是说,您需要一个只包含输入的文件,然后您的模板可以为您提供输出文件。我不确定这是否可以接受。

您可以编写一个模板来读取该输入并输出该输出。但是,我不确定你能否在线完成。也就是说,您需要一个只包含输入的文件,然后您的模板可以为您提供输出文件。我不确定这是否可以接受。

有很多方法可以做到这一点,即使你可能不应该这样做(正如你似乎意识到的,这只会导致毫无意义的例外)。然而,这里有一个sed/sh组合来做第一个。它不处理自动编号或其他变体。我将把它作为手术的练习

P1='\/\/+'; P2='\(.*\)'; P3='\/\/+(+\([^$]*\)$\(.*\))'; 
echo 'foo()\n//+\na++\n//+(+SomeException$Message)'|sed ' /'$P1'/ { N; /'$P2'/ { N; /'$P3'/ { s/'$P1'\n'$P2'\n'$P3'/try\n{\n\t\1\n}\ncatch (AnException)\n{\n\tthrow;\n}\ncatch (Exception ex)\n{\n\tthrow new \2("\3", "0", ex);\n}/ } } } '

回音只是一个测试字符串。

有很多方法可以做到这一点,尽管您可能不应该这样做(正如您似乎意识到的,这只会导致无意义的异常)。然而,这里有一个sed/sh组合来做第一个。它不处理自动编号或其他变体。我将把它作为手术的练习

P1='\/\/+'; P2='\(.*\)'; P3='\/\/+(+\([^$]*\)$\(.*\))'; 
echo 'foo()\n//+\na++\n//+(+SomeException$Message)'|sed ' /'$P1'/ { N; /'$P2'/ { N; /'$P3'/ { s/'$P1'\n'$P2'\n'$P3'/try\n{\n\t\1\n}\ncatch (AnException)\n{\n\tthrow;\n}\ncatch (Exception ex)\n{\n\tthrow new \2("\3", "0", ex);\n}/ } } } '
回音只是一个测试字符串

最好的方法是什么?我是否应该编写自己的代码来执行替换,或者是否有一些regex替换工具或类似的工具可以自动为我执行替换

我写了一个C++程序或C语言程序。可能还有其他工具和脚本语言可以做到这一点;但鉴于C++或C语言中的琐碎工作,并且我知道如何用这些语言来完成它,为什么不呢? 我不知道你所说的“最佳”方式是什么意思,但对我来说,至少这是最简单的方式之一

最好的方法是什么?我是否应该编写自己的代码来执行替换,或者是否有一些regex替换工具或类似的工具可以自动为我执行替换

我写了一个C++程序或C语言程序。可能还有其他工具和脚本语言可以做到这一点;但鉴于C++或C语言中的琐碎工作,并且我知道如何用这些语言来完成它,为什么不呢?
我不知道你所说的“最佳”方法是什么意思,但至少对我来说,这是最简单的方法之一。

作为一名Emacs用户,我会通过定义键盘宏来完成这项工作, 然后使用set/increment/insert寄存器进行自动编号。那里 不需要编写自己的elisp函数

不过,如果您需要在多个文件上执行此操作,您将
写一个脚本来完成这项工作可能会更好。

作为一个Emacs用户,我会通过定义键盘宏来完成这项工作, 然后对au使用set/increment/insert寄存器