2

我不确定是否可以在一个正则表达式中完成,但问一下也无妨。

我创建了表达式:

/(?<variable>\w+)((\.(?<method>\w+)\((?<parameter>[^{}%]*)\))|(\.(?<subvariable>\w+)))?/i

这有助于我将虚线字符串“转换”为数组或调用方法:

core.settings => $core['settings'] 
core.set(param1, param2) => $core->set('param1', 'param2')

它工作得很好。但我不知道如何构建一个像这样工作的多级表达式:

  1. 字符串:core.settings
group <variable> = core  
group <subvariable> = settings
  1. 字符串:core.get(参数)
group <variable> = core
group <method> = get
group <parameter> = param
  1. 字符串 core.settings.time
group <variable> = core
group <subvariable> = settings.time
  1. 字符串 core.settings.time.set(param)
group <variable> = core
group <subvariable> = settings.time
group <method> = set
group <parameter> = param

有任何想法吗?以及一般情况下是否可行?

4

1 回答 1

1

您可以使用

^(?<variable>\w+)(?:\.(?<subvariable>\w+(?:\.\w+)*))??(?:\.(?<method>\w+)\((?<parameter>[^{}%]*)\))?$

请参阅正则表达式演示

详情

  • ^- 字符串的开始
  • (?<variable>\w+)- 组“变量”:一个或多个单词字符
  • (?:\.(?<subvariable>\w+(?:\.\w+)*))??- 零次或一次出现,.然后将匹配一个或多个单词字符的“子变量”分组,然后是零次或多次出现的 a.和一个或多个单词字符
  • (?:\.(?<method>\w+)\((?<parameter>[^{}%]*)\))?- 一个可选的序列
    • \.- 一个点
    • (?<method>\w+)- 组“方法”:一个或多个单词字符
    • \(- 一个(字符
    • (?<parameter>[^{}%]*){- 组“参数”:除, },之外的零个或多个字符%
    • \)- 一个)字符
  • $- 字符串结束。
于 2021-03-15T17:59:32.870 回答