我正在编写Java代码,最近将这个list- of actions类中的一些方法委托给一个BasicActions类,现在我希望更新该类中的所有方法,而不是引用BasicActions方法。我正在更新的方法和我希望它们引用的方法具有相同的名称和参数,我试图使用regex重写代码,但我不知道如何处理方法参数,其中可能有任何数字,而且我不能简单地复制组-组-组,因为我需要从其中删除关键字。
Example input:
public void jumpTo(final double x, double y) {
/*arbitrary code,
possibly spanning multiple lines*/
}
Desired output:
public void jumpTo(double x, double y) {
addAction(BasicActions.jumpTo(x, y));
}
Almost-correct solution:
pattern: (public void ([a-zA-Z]*)\(((final )?([a-zA-Z]+) ([a-zA-Z]+(, )?))*\) \{\n *)((.*\n)*?)( })
replacement: $1addAction(BasicActions.$2($6));\n$10
Almost-correct output: (doesn't remove unnecessary 'final' keywords, only captures the final argument)
public void jumpTo(final double x, double y) {
addAction(BasicActions.jumpTo(y));
}参见https://regex101.com/r/uE7aA1/1的几乎-解决方案。
我的问题是,由于我不能包含type关键字(在本例中是double),所以必须拆分变量名,然后多次捕获变量名。如何访问多个捕获,或者在复制多个参数时重新格式化它们?
发布于 2015-02-15 07:42:36
除了最终的顺序之外,不可能引用重复捕获组;因此,如果要修改每个捕获组,如在这种情况下,必须按顺序应用多个正则表达式:
步骤1:将参数列表复制到位置(https://regex101.com/r/uE7aA1/2)
pattern: (public void (\w+\((?:(?:final )?\w+ \w+(?:, )?)*\))) \{(?:.|\n)*?\n \}
replacement: $1 {\n addAction(BasicActions.$2);\n }
output:
public void jumpTo(final double x, double y) {
addAction(BasicActions.jumpTo(final double x, double y));
}步骤2:删除final
pattern:final #note the space
replacement:
output:
public void jumpTo(double x, double y) {
addAction(BasicActions.jumpTo(double x, double y));
}步骤3:删除类型关键字(https://regex101.com/r/kC0nA3/3)
use lookahead to match any argument without passing over other arguments
pattern: \w+ (\w+)(?=(, \w+ \w+)*\)\);\n })
replacement: $1
output:
public void jumpTo(double x, double y) {
addAction(BasicActions.jumpTo(x, y));
}https://stackoverflow.com/questions/28523178
复制相似问题