CTags的多行正则表达式

4

我有一些 Java 代码。

@Subscribe
public void catchEvent(SomeEvent
我希望将其与我的 ~/.ctags 中的以下内容匹配:
--langdef=javaspring
--langmap=javaspring:.java
--regex-javaspring=/@Subscribe(\s)*([a-z ]+)\s([a-zA-Z]*)\(([a-zA-Z]*)/\3-\4/
这应该生成类似于“catchEvent-SomeEvent”的内容,但实际上并没有。如果我在@Subscribe和public void之间删除换行符,则可以正常运行。
@Subscribe public void catchEvent(SomeEvent

rm -rf tags && ctags -R . && cat tags|grep Subs
catchEvent-SomeEvent    PathToMyFile.java    /^@Subscribe public void catchEvent(SomeEvent event) {$/;"      r

我甚至尝试使用如下的行首和行尾

--regex-javaspring=/^\s*@Subscribe[a-z \s]+\s([a-zA-Z]+)\(([a-zA-Z]+).*$/@Subscribe \1 \2*/

你知道我是否可以使用当前的ctag实现来完成这个操作吗?我做错了什么或者现在的ctags不支持多行正则表达式吗。

谢谢!


一些正则表达式方言使用 \_s 来表示包括换行符在内的空白字符,而 \s 不包括换行符。我不知道这是否有效,但值得一试。 - Codie CodeMonkey
1个回答

2
对于Universal Ctags,您可以使用--mline-regex-<LANG>功能,并带有{mgroup=1}选项:
--mline-regex-javaspring=/^\s*@Subscribe[a-z \s]+\s([a-zA-Z]+)\(([a-zA-Z]+).*$/@Subscribe \1 \2*/{mgroup=1}

mgroup选项是必要的,以告诉Ctags如何确定表达式的行号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,