【问题标题】:Javascript String template parsing for keywords关键字的Javascript字符串模板解析
【发布时间】:2022-01-04 23:40:12
【问题描述】:

我有一个包含几个动态关键字的字符串模板,例如:

I am {{name}} from {{city}}

对于给定的输入字符串,我想将其与模板进行匹配,并从 Javascript 的输入中提取 namecity。 例如。输入 I am Alex from Paris 应将我的名字命名为 Alex,将城市命名为 Paris

在 Javascript 中是否有执行此类操作的标准方法?

【问题讨论】:

    标签: javascript regex string


    【解决方案1】:

    在这种情况下,我们使用模板文字。不使用单引号或双引号,而是使用 (`) 定义字符串并使用美元符号 ($) 传递变量

    例如: `I am ${name} from ${city}`

    【讨论】:

    • 我不认为这是OP想要的......他不想将变量插入字符串;他想把它们拿出来。
    【解决方案2】:

    一种方法是使用正则表达式。由于您已经知道字符串的结构,您可以将字符串的各个部分组合在一起并始终提取相同的部分。一个缺点是每次更新模板字符串时都需要更新正则表达式。

    例如:

    使用以下正则表达式:

    ^(I am )(.*)( from )(.*)$
    

    将产生 4 个组。第二组将是 name 的值,第四组将是 city

    的值

    通过https://regex101.com/r/7tl7Ap/1 的一些示例查看它的实际应用

    【讨论】:

      【解决方案3】:

      如果您可以控制您的模板,则可以将其设为正则表达式以使用命名捕获组(?<groupName>),然后在您的字符串上使用.match() 来获取匹配的组:

      const template = /^I am (?<name>[^ ]+) from (?<city>[^ ]+)$/;
      const str = "I am Alex from Paris";
      const {groups} = str.match(template);
      console.log(groups);

      如果您需要将模板保留为字符串,您也可以将模板解析为上述正则表达式,但如果模板由用户提供,则可能需要对其进行转义。小例子:

      const templateToRegExp = (strTemplate) => {
        const regTemp = strTemplate.replace(/{{([^}}]+)}}/g, "(?<$1>[^ ]+)");
        return new RegExp(`^${regTemp}$`);
      }
      
      const template = "I am {{name}} from {{city}}";
      const regexp = templateToRegExp(template);
      const str = "I am Alex from Paris";
      const {groups} = str.match(regexp);
      console.log(groups);

      【讨论】:

        【解决方案4】:

        var string = 'my name is var';
        var data = 'pratik';
        console.log(string.replace("var", data))

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2015-11-11
        • 2013-08-28
        • 1970-01-01
        • 2014-01-04
        • 2020-06-21
        • 2020-02-24
        • 2011-12-18
        • 2017-03-01
        相关资源
        最近更新 更多