【问题标题】:How to find function inside struct如何在结构中找到函数
【发布时间】:2017-02-06 01:25:36
【问题描述】:
struct mbuh
(

lineshg = 0,
tres = "text",

    fn track all:#() = 
        (
        local c -- clone
            local lpoint = [0,0,0] -- previous point created
            local ccoll = #() -- array for created objects
            local prev = [0,0] -- var for alt distance changing
        ),

    fn listzfun trs:123 x:#() = 
        (
        obj = snapshotasmesh a
            min_vz = max_vz = in coordsys world (getvert obj 1).z
            min_vx = max_vx = in coordsys world (getvert obj 1).x
            min_vy = max_vy = in coordsys world (getvert obj 1).y
        )
)

fn brung man: =
(

)

作为上面的例子,我想找到单词“struct xx”和“fn xxx”,但只有“fn xxx”在结构范围内而不是在它之外[“fn brung xxx”],我使用这个正则表达式来找到它

^.*?(\bstruct\s*\w+\b)|^.?(\bfn\b+[\w\s:#()""]*)

但它在结构范围内外搜索所有 fn 单词,所以问题是我如何才能找到仅在上面示例中的结构范围内的单词 fn xxx [fn track xxx 和 fn listzfun xxx] ?

非常感谢。

【问题讨论】:

  • 我确实认为regex is not suitable for parsing source code。您应该改为use a lexer
  • 虽然可以使用正则表达式来做到这一点,但仅使用正则表达式就很难做到圆括号/括号平衡。如果不出意外,我建议先对此进行另一种形式的解析。
  • 但这很难做到吗?作为附加信息,结构内部的每个“fn”都以逗号分隔,而其外部的“fn”不以逗号分隔。谢谢

标签: regex


【解决方案1】:

你可以用这个正则表达式试试:

(struct\s*\w+.*?(?=fn))(fn.*?(?=\),)\)).*?(?=fn)(fn.*?\))(?=\R\))

演示:https://regex101.com/r/zGAt4D/9

【讨论】:

  • 谢谢,我尝试开发它。但是 /R 在 c# 4 中给了我一个错误。它说“不支持 \R 匹配 Unicode 换行符”。谢谢
  • @fajarvashra 我不知道c#。请记住打开单行标志。即. 应该匹配包括换行符在内的所有内容。
  • 我使用正则表达式转换为 c# 正则表达式,但它没有显示任何结果 [code] @"struct\s*\w+.*?(?=fn)(fn.*?(?= ),))).*?(?=fn)(fn.*?))(?=(?>\r\n|[\n\v\f\r\x85\u2028\u2029]))) "[/code]
  • @fajarvashra 也使用原始字符串。
  • 你能用原始字符串解释一下吗?
【解决方案2】:

我得到了与 MYGz 相同的等式,但它在 c# 中

@"\bstruct\s*\w+\s
\(
(?>
[^()]+
|
\((?<Depth>)
|
\)(?<-Depth>)
)*
(?(Depth)(?!))
\)
"

希望这对将来的其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多