首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何引用重复嵌套捕获组?

如何引用重复嵌套捕获组?
EN

Stack Overflow用户
提问于 2015-02-15 05:05:52
回答 2查看 1.1K关注 0票数 1

我正在编写Java代码,最近将这个list- of actions类中的一些方法委托给一个BasicActions类,现在我希望更新该类中的所有方法,而不是引用BasicActions方法。我正在更新的方法和我希望它们引用的方法具有相同的名称和参数,我试图使用regex重写代码,但我不知道如何处理方法参数,其中可能有任何数字,而且我不能简单地复制组-组-组,因为我需要从其中删除关键字。

代码语言:javascript
运行
复制
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),所以必须拆分变量名,然后多次捕获变量名。如何访问多个捕获,或者在复制多个参数时重新格式化它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-15 07:42:36

除了最终的顺序之外,不可能引用重复捕获组;因此,如果要修改每个捕获组,如在这种情况下,必须按顺序应用多个正则表达式:

步骤1:将参数列表复制到位置(https://regex101.com/r/uE7aA1/2)

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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));
}
票数 0
EN

Stack Overflow用户

发布于 2015-02-15 06:05:54

当捕获组被重复时,只捕获最后一个项。与正则表达式

代码语言:javascript
运行
复制
public void ([a-zA-Z]*)\((?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))*\)  

在(?:)中,为了避免不必要的捕获复杂性和来自地狱的编号,$0是整体,$1是"jumpTo“,$2是"y”。不幸的是,x不能这样被捕获。

您可能需要引爆正则表达式,通过多次重复匹配的参数,我在这里重复了3次(您可能需要更多),

公共无效(a*)((?:(?)(?)-zA+(?-zA+(?:,)?)(?:终结)?a+(a+(?:,)?)?(?:(?:终结)?a-zA+(a-zA+(?:,)?))

$1是"Jumpto",$2是"x ",$3是"y“,$4是空的。

编号很简单,因为不计算非捕获组。

/*arbitrary代码*/可以有一个更简单的匹配非捕获规则

代码语言:javascript
运行
复制
\{(?:.|\n)*?\n    \} 

和替换规则

代码语言:javascript
运行
复制
{\n    addAction(BasicActions.$1($2$3$4$5$6$7));\n    }\n

最终的regexp最多可达6个参数(分为多行)。

代码语言:javascript
运行
复制
(?x: header match starts from here)
(public void ([a-zA-Z]*)\(
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 1)
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 2)
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 3)
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 4)
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 5)
(?:(?:final )?[a-zA-Z]+ ([a-zA-Z]+(?:, )?))?(?x: param 6)
\))
(?x: match body starts here) \{(.|\n)*?\n    \}
()()()()()()(?x: for missing params 1-6)

哪里

$1是最初的功能原型

$2是从函数名中提取的名称

$3是第一个参数(或空字符串)

$4是第二个参数(或空字符串)

$5是第三个参数(或空字符串)

.

很容易扩展到4,5,6,7,参数,具有更长的正则表达式,并且在计算捕获组时没有问题。最后()()。确保捕获组是空的,而不管参数的数量(这取决于regex引擎的实现)。一些regex引擎可能不喜欢空(),但是很少有人检测到空字符串的这种自愿匹配。

代码语言:javascript
运行
复制
((?x:))

捕获组中的regexp注释。

(编辑了很多次,因为排字和外观,(.|\n)是半盲人阅读一个曲折的正则表达式的笑脸)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28523178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档