【问题标题】:Regex for parsing functions in a file getting lost用于解析文件中函数的正则表达式丢失
【发布时间】:2020-11-13 18:56:26
【问题描述】:

我正在为 xHabour 语言创建一个搜索和存储函数名称的应用程序。

为了在单个存档中获取所有功能,我使用解析所有内容

  RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnoreCase;
  string[] parts = Regex.Split(content, @"(static|^^).*function\s(.*)\)", options);

content 变量包含我解析的文件中的所有缓冲区

在大多数情况下,他的所有功能都可以,但是在某些功能的中间出现FUNCTION这个词,并且正则表达式也越来越多

代码示例:

Function dropProcedure(cProcedure, cDatabase )

local cCmdSql := ''

cProcedure := lower( cProcedure )

cCmdSql := 'DROP FUNCTION if exists '+cDataBase+'.`'+cProcedure+'`'+CRLF 

return sqlexecute( cCmdSql )

我的问题是如何使用正则表达式来避免这种情况

关闭:我尝试使用 language grammar TextMate 架构,但我在 C# 中找不到任何示例来使用此架构解析器或 vscode (here) 从那时起如何实现解析器(我找到了 xharbour/ 的整个架构海港here)

【问题讨论】:

  • (static|^).*?function\s(.*)\) 适合你吗?
  • 不,他正在获取“字符串”声明中的函数
  • 这就是为什么正则表达式不适合解析编程语言,它用于处理简单的正则表达式
  • @TheGeneral 是的,但是在这种情况下可以工作,我唯一缺少的是字符串中的函数
  • 如果你想走这条路,最好显示你需要解析的函数签名的类型,这样有人可以编写更合适的正则表达式

标签: c# regex parsing grammar


【解决方案1】:

我打算将您指向您已经建立的链接。在港口函数位于一行的开头,或者至少在 ; 之后我会利用它来发挥我的优势

(?:^|;)\s*(?:static\s)?\s*function\s+(\w+)

(:? 是我现在所说的非捕获组的开始,并在我的其余解释中忽略它

^|; 查找行首或 ;在港口打破了一条线

\s* 查找任意数量的空格(\n\r\t

(:?static\s)? 可选地查找单词 static 后跟一个空格

\s* 再次出现空格

function 查找函数一词。您可能需要(?:function|procedure|method),但这并不完整,只需要关键字的前 4 个字母,其余的都是可选的,但这很难看,您可以在您发布的 github 链接中看到。

\s+ 一些空格

(\w+) 捕获函数名。这将在 ( 或空格处停止,但会包含字母数字和下划线。

希望现在帮上忙还为时不晚。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2010-09-08
    • 2022-01-25
    • 1970-01-01
    • 2013-12-31
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多