You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式以匹配字符串中的函数调用,实现可选链替换?

给多级属性访问(含函数调用)添加可选链?.的正则方案

需求说明

需要将字符串中的多级属性访问、带函数调用的表达式转换为可选链形式,示例输入输出如下:

const inputs = [
  'foo', // foo
  'foo.bar', // foo.bar
  'foo.bar.baz', // foo.bar?.baz
  'bla.some()', // bla.some?.()
  'bla.bar.you()', // bla.bar?.you?.()
  'account === prop.account.id', // account === prop.account?.id
  '{ myclass: foo.bar.baz }', // { myclass: foo.bar?.baz }
];

原正则的局限

原正则/(?<=\w+\.)(\w+)\.(?!\?)/g仅能处理属性访问场景(如foo.bar.baz),无法匹配函数调用的情况(如bla.some()),导致这类场景无法添加可选链。

修改后的正则及替换逻辑

将正则扩展为同时匹配属性访问的.和函数调用的(,修改后的正则为:

/(?<=\w+\.)(\w+)(\.|\()(?!\?)/g

替换时使用'$1?.$2',即给匹配到的属性名/函数名后插入?.,保留后续的.或(。

测试代码

const inputs = [
  'foo', // foo
  'foo.bar', // foo.bar
  'foo.bar.baz', // foo.bar?.baz
  'bla.some()', // bla.some?.()
  'bla.bar.you()', // bla.bar?.you?.()
  'account === prop.account.id', // account === prop.account?.id
  '{ myclass: foo.bar.baz }', // { myclass: foo.bar?.baz }
];

inputs.forEach((input) => {
  const output = input.replace(/(?<=\w+\.)(\w+)(\.|\()(?!\?)/g, '$1?.$2');
  console.log(`${input} → ${output}`);
});

正则解释

  • (?<=\w+\.):正向预查,确保匹配位置前是「单词+.」的结构(即前面是一个已有的属性访问)
  • (\w+):捕获需要添加可选链的属性名或函数名
  • (\.|\():捕获后续的属性分隔符.或函数调用的(
  • (?!\?):负向预查,避免给已经存在?的位置重复添加可选链

内容的提问来源于stack exchange,提问作者Jon Sud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:05:14