当这些单词可能出现一次或两次时,如何根据单词列表正确设置分组?

问题描述 投票:0回答:1

就上下文而言,我对 Go 完全陌生,而且我从未使用过正则表达式。

为了获得更多的实践经验,我正在尝试编写一个转换器,通过递归地遍历我选择的目录,打开每个 Zephir ( .zep) 文件,进行必要的语法修改,然后将修改后的内容保存到输出目录中的 PHP (.php) 文件。

到目前为止,这个过程相对来说比较轻松,但现在我正在处理一个更复杂的正则表达式函数,我在为其编写模式时遇到了困难。我希望我能得到一些帮助来正确格式化我的模式,以便它正确地定位我需要的内容。

现在,我正在尝试查找打开的 Zephir 文件的类中的所有属性声明。但是,由于属性名称前面的关键字可以是一个或两个关键字,因此我需要能够可靠地将关键字设置为组 1,以及将其设置为组 2。下面是示例 I正在努力确定目标和期望的结果。

样品:

protected static autoEscape = true;
private documentAppendTitles;

期望的结果:

Match: [Group 1: protected static] [Group 2: autoEscape = true;]
Match: [Group 1: private] [Group 2: documentAppendTitles;]

为了实现我想要的匹配和分组,我创建了以下正则表达式模式:https://regex101.com/r/Tctf7s/1

虽然这确实按照我想要的方式突出显示和分组匹配,但它也会产生与文件中的所有其他代码行匹配的意外结果。我认为这是因为我的第一个组有一个嵌套的非捕获组,因此如果它没有找到该模式的匹配项,则父组本身可以是任何内容,从而触发几乎每一行作为匹配。

问题是我不确定正确的模式语法是什么,以确保我将这些属性关键字分组为一组,无论是否只有一个或两个关键字。

我的最终目标是每场比赛只获得两个组,因为 Go 不支持负向前瞻,所以我需要检查第 2 组并确保该属性不是方法/函数,然后在前面附加“$”符号用于语法替换。

我有一种感觉,我可能只是缺少第 1 组模式中的某种指标以确保它不为空,但是由于我缺乏经验,有没有更好的方法来编写我不知道的方法?

regex go regex-group
1个回答
0
投票
  1. 使用交替:

    (受保护|私有|公共)\s+(静态|自动)\s+(\w+)(?:\s*=\s*(.+?);)?

  2. 使用积极的前瞻:

    (受保护|私有|公共)\s+(?:static|auto)?\s+(\w+)(?=\s*=\s*|$)

© www.soinside.com 2019 - 2024. All rights reserved.