【问题标题】:Regex Notepad++ Function List正则表达式记事本++函数列表
【发布时间】:2017-02-25 01:45:31
【问题描述】:

我正在尝试创建一个正则表达式,它将使用 functionList.xml 文件为 notepad++ 内的专有编程语言创建一个函数列表。正则表达式需要按照以下语法捕获任何MethodFunctionMacro 的所有实例:

 Method Blah1(pParam1, pParam2)
   [New] dynamicVar = "string"
   [New] dynamicVar2 = 4
   [New] result = Bar2(dynamicVar, dynamicVar2)
 End Method

 Function Bar2(pParam3, pParam2)
   Foo3
   Return pParam3 && pParam2
 End Function

 Macro Foo3()
 End Macro

因此,正则表达式应该为上述示例捕获 3 个实例。

正则表达式链接:http://www.regexr.com/3fcd7

函数列表.xml

        <parser
            displayName="MOX"
            id         ="mox_function"
            commentExpr="(?s:/\*.*?\*/)|(?m-s://.*?$)"
        >
            <function
                mainExpr="^(s|Method|Macro|Function)"
            >
                <functionName>
                    <nameExpr expr="[A-Za-z_]\w*\s*[=:]|[A-Za-z_]?\w*\s*\(" />
                    <nameExpr expr="[A-Za-z_]?\w*" />
                </functionName>
                <className>
                    <nameExpr expr="([A-Za-z_]\w*\.)*[A-Za-z_]\w*\." />
                    <nameExpr expr="([A-Za-z_]\w*\.)*[A-Za-z_]\w*" />
                </className>
            </function>
        </parser>

【问题讨论】:

  • 你有什么问题?
  • 我需要一个正则表达式,它将选择存在 ("Method" AND "End Method") OR ("Macro" AND "End Macro") OR ("Function" AND“结束函数”)
  • 如果Method和End之间有东西怎么办?它还应该匹配吗?
  • 是的,Method和End之间可以有任何东西

标签: regex notepad++


【解决方案1】:

试试这个。

(?m)^(Method|Macro).*\(.*\)\n.*\n?^\s?End.*$

https://regex101.com/r/pAkFDU/

【讨论】:

  • 感谢您的回答,不幸的是,这并没有为记事本++创建我的函数列表。这是我要实现的目标的链接:notepad-plus-plus.org/features/function-list.html 但如果我无法弄清楚,我会将您的答案标记为正确。
【解决方案2】:

我从来没有使用过 FunctionList。长期以来一直存在稳定性问题,默认情况下甚至没有在插件管理器中列出。

可能 极有可能包含过多的表达式无法正确捕获嵌套组(除非 FunctionList 通过匹配递归,或支持正则表达式中的递归)。只是您应该注意的事情。

过于包容的正则表达式经常会遇到这样的场景

Function foo()
  Function refoo()
  End Function         // 1
End Function           // 2

Function solo(stuff,thing)
End Function

Function bar()
  sample = Function (x,y)
    return x & y
  End Function
End Function           // 3 

在第 1 点或第 3 点失败。正确捕获函数可能非常困难,除非您有可用的递归。 (Function|Method|Macro)[\s\S]*?End \1 捕获太少;把? 拿走,它捕获的东西太多了。

真正的递归 ((?R)) 正则表达式(或平衡对),未被广泛支持,可以正确捕获到正确的点,但没有代码通过它递归,不会标记嵌套函数。

(Function|Method|Macro) (\w+)\((.*)\)((?:(?R)|[\s\S]*?)+)End \1 会正确地停在第 2 点。

您可以使用带有前瞻的类似表达式:(Function|Method|Macro) (\w+)\((.*)\)(?=(?:(?R)|[\s\S]*?)+End \1),但它也很容易被愚弄。它基本上只关心End \1,在文件中任何地方跟随它。

如果 FunctionList 确实支持递归正则表达式并且不通过结果递归(代码端)(我不知道,该插件对我不起作用),我会看一个更简单的表达式,如下所示。老实说,即使是这样,你也会从一个简单的表达中获得最好的表现。它会工作得更快,你会确切地知道它是什么,没有表明什么。其他任何东西都有太多的开销,而收益却相对较小。

^\s*(Function|Method|Macro) (\w+)\((.+)\)
Output: \2     Args:  \3

^\s*(Function|Method|Macro) (\w+)\(\)
Output: \2

输出只是示例,我使用的插件可让您自定义输出。其他人可能没有。此外,以^\s* 为前缀可让您找到未分配给变量或已注释掉的函数。

或者通过将第一个表达式的+ 更改为*,可以在一个表达式中捕获以上两者。它不会告诉您是否有匹配的End,但它会找到您感兴趣的文档大纲部分。


就我个人而言,我一直很幸运地使用了一个类似的名为“SourceCookifier”的插件,但它只在文件上次保存/打开时解析文件。如果我添加一个新函数,它在保存/打开之前不会列出。

添加新语言的界面不是很直观,在一个小区域内包含了很多功能,但它可以运行并且运行良好。与 FunctionList 以及可能的大多数其他替代方案一样,您需要为“Mox”添加规则。

我并不是说你应该切换到这个特定的实用程序,但 FunctionList 已经 7 年没有更新了。

【讨论】:

  • 我忘了提到所有这些method/function/macro 都有参数(更新的 OP),所以当参数出现时,你的示例停止工作,但我能够将其修改为:^\s*(Function|Method|Macro) (\w+)\( 并且它是工作正常!如果正则表达式还捕获了Function|Method|Macro 以及pParam 名称,那可能会很好,因为我的函数列表中显示的只是Foo3 等,但这是一个很好的原型。谢谢!可能会为此请求提供 50 声望.. 哈哈
  • @SuperVeetz 忘记在之前的评论中标记你了。您可能从未见过 --- (1) 大声笑,在我看到您的评论之前,我注意到第一个示例中 \s+ 的错字(诚实,错字)。 (2) 它确实已经将(Method|Function|Macro) 类型捕获为第一个捕获组\1。我希望这会有所帮助。
猜你喜欢
  • 2018-11-17
  • 1970-01-01
  • 2014-05-03
  • 2016-05-18
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多