【问题标题】:Multiline regex for ctagsctags 的多行正则表达式
【发布时间】:2021-02-01 17:27:03
【问题描述】:

我有一些 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 不包括换行符。我不知道这是否可行,但值得一试。

标签: regex ctags exuberant-ctags


【解决方案1】:

对于通用 Ctag,您可以使用 --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 如何确定表达式的行号所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-04-13
    • 2012-02-03
    相关资源
    最近更新 更多