带异常的点分字符串的正则表达式

Regular expression for dotted string with exception

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

我创建了表达式:

/(?<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.时间
group <variable> = core
group <subvariable> = settings.time
  1. 字符串core.settings.time.set(参数)
group <variable> = core
group <subvariable> = settings.time
group <method> = set
group <parameter> = param

有什么想法吗?以及是否普遍可行?

你可以使用

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

参见regex demo

详情:

  • ^ - 字符串开头
  • (?<variable>\w+) - 组“变量”:一个或多个单词字符
  • (?:\.(?<subvariable>\w+(?:\.\w+)*))?? - . 零次或一次出现,然后是匹配一个或多个单词字符的组“子变量”,后跟 . 零次或多次出现以及一个或多个单词字符
  • (?:\.(?<method>\w+)\((?<parameter>[^{}%]*)\))? - 一个可选的序列
    • \. - 一个点
    • (?<method>\w+) - 组“方法”:一个或多个单词字符
    • \( - 一个 ( 字符
    • (?<parameter>[^{}%]*) - 组“参数”:除 {}%
    • 以外的零个或多个字符
    • \) - 一个 ) 字符
  • $ - 字符串结尾。