【问题标题】:Get function names from specific string从特定字符串中获取函数名称
【发布时间】:2022-11-20 03:38:46
【问题描述】:

我用斜杠分隔的字符串包含函数名称。

e.g.
my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()

在上面的字符串中,我只想要函数名即 getCustomer()、getControllerName() 和 getCsvFileName()

我搜索了一些正则表达式,例如:

let res = myString.match(/(?<=(function\s))(\w+)/g);

但它的返回结果为空。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你可以像/.*?([^)]*)/g一样先拆分带括号()的字符串。

    这将给出结果数组,之后您可以迭代数组数据,对于每个项目,您可以在 item.split(/=|//) 的帮助下拆分函数名称前的 =/

    然后将过滤后的函数名压入空数组functionNames

    工作示例:

    const string = `my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()`;
    
    const functionNames = [];
    
    string.match(/.*?([^)]*)/g).forEach(item => {
      const splitString = item.split(/=|//);
      const functionName = splitString[splitString.length - 1];
      functionNames.push(functionName);
    });
    
    console.log(functionNames);

    【讨论】:

      【解决方案2】:

      const str = "my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()"
      
      let tokens = [];
      
      for (element of str.split("/"))
        if (element.endsWith("()"))
          tokens.push(element.split("=")[1] ?? element.split("=")[0])
      
      console.log(tokens);

      一般想法:沿斜杠拆分字符串,对于这些标记中的每一个,如果标记以 () 结尾(根据 Nick 的建议),则沿 = 拆分标记。如果存在,则附加沿 = 分割的令牌的第二个索引,否则附加第一个。

      “较小”版本(使用纯数组方法)可能是:

      const str = "my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()"
      
      let tokens = str.split("/")
                      .filter(element => element.endsWith("()"))
                      .map(element => element.split("=")[1] ?? element.split("=")[0]);
      
      console.log(tokens);

      【讨论】:

      • .endsWith() 可能比采用子字符串更有意义。
      【解决方案3】:

      按照 MDN docs match() 方法返回 null 如果它在提供的搜索字符串中找不到提供的正则表达式的匹配项。

      您提供的正则表达式,/(?&lt;=(functions))(w+)/g 匹配任何包含 '功能' 在它之前。 (注意:单词函数后有一个空格)

      您的搜索字符串 my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName() 没有在任何字符前包含“function”。这就是为什么您使用 match() 方法得到 null 的原因。

      let yourString = 'my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()';
      
      let myReferenceString = 'SAMPLETEXTfunction sayHi()/function sayHello()';
      
      
      let res = yourString.match(/(?<=(functions))(w+)/g);
      let res2 = myReferenceString.match(/(?<=(functions))(w+)/g);
      
      console.log("Result of your string", res);
      console.log("Result of my string", res2);

      我的解决方案在这里,

      let myreferenceString = 'my_doc/desktop/customer=getCustomer()/getCsvFileName()/controller=getControllerName()'
      
      let res = myreferenceString.match(/((?<==)(w+()))|((?<=/)(w+()))/g);
      
      console.log("Result", res);

      注意:我使用了“Positive Look Behind regex operator”,这在 Safari 和 IE 等浏览器中不受支持。在考虑这种方法之前,请对此进行研究。

      【讨论】:

      • 您的解决方案不适用于 getCsvFileName()
      • @humanbean,在发布时我在'|'之后的正则表达式中添加了一个额外的空间作为一个打字错误,我感到很抱歉,我立即更正了我。现在它工作正常。
      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多