【问题标题】:PegJS - match all characters including ) except if ) is the last characterPegJS - 匹配所有字符,包括 ) 除非 ) 是最后一个字符
【发布时间】:2018-08-09 13:28:20
【问题描述】:

我正在编写一个 PegJS 语法来解析 SQL 语句。我正在将一个函数拆分为function_id(function_args)。对于函数 args,我想匹配所有字符,包括 (),除了最后一个 ),这对于嵌套函数是必需的。

我如何编写一个规则来匹配包括) 的所有字符,除非) 是字符串中的最后一个字符。

语法如下

 Function 
 = func_name open_p args close_p

func_name 
= name:[A-Z]+ {return name.join('');}

open_p
= "("

close_p
= ")"

args
= ar:(.*[^)]) {return ar.join('');}

测试字符串是

AVG(A + AVG(B + C))

【问题讨论】:

  • 如果是),为什么不直接删除最后一个字符? "AVG(A + AVG(B + C))".replace(/\)$/, '')"
  • 不幸的是,该字符串无法被操作,因为它是在 PegJS 中解析的较大字符串的一部分。因此只允许 PegJS 操作。

标签: javascript regex pegjs


【解决方案1】:

正确处理参数的规则会有所帮助。此外,您可以在规则中使用$() 表示法来组合已解析的字符串,而不是使用{return name.join('');}

args 可以是 functionnonfunction 重复。 nonfunction 通过前瞻捕获所有不是函数的内容。

function 
 = func_name open_p (args+ / "") close_p

func_name 
= $([A-Z]+)

open_p
= "("

close_p
= ")"

args
= function / nonfunction

nonfunction
= $((!(function / close_p) .)+)

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多