【问题标题】:A regex query in GrafanaGrafana 中的正则表达式查询
【发布时间】:2021-12-06 17:39:56
【问题描述】:

我在Jenkins中有这个项目名称:

dir1/dir2/dir3/projectname

现在,我想提取每个目录 [dir1,dir2,dir3] 并将其保存到不同的变量以及项目名称中。例如:var1: dir1var2: dir2,var3: dir3projectname: projectname 我使用了很多正则表达式,但遗憾的是我还不能。 我最后的努力是:

/(.*)//

但它不能正常工作。

【问题讨论】:

    标签: regex grafana grafana-variable


    【解决方案1】:

    如果目录的数量是固定的,那么你可以使用这个正则表达式:

    (?<var1>[^\/]+)\/(?<var2>[^\/]+)\/(?<var3>[^\/]+)\/(?<projectname>[^\/]+)

    你可以在这里测试它:https://regex101.com/r/neV5UU/1/

    概念是使用具有(?<groupname> ) 语法的命名组。我更喜欢搜索除带有模式[^\/] 的斜线之外的任何字符(斜线必须被转义,因为它用于开始和结束正则表达式)而不是匹配任何内容的.*

    在 JavaScript 中运行的示例:

    const regex = /(?<var1>[^\/]+)\/(?<var2>[^\/]+)\/(?<var3>[^\/]+)\/(?<projectname>[^\/]+)/g;
    let output = '';
    
    const paths = [
      'dir1/dir2/dir3/projectname',
      'first/second/third/another-project-name'
    ];
    
    paths.forEach(path => {
      output += `${path}\n`;
      let m;
      while ((m = regex.exec(path)) !== null) {
        Object.keys(m.groups).forEach((name, index) => {
          output += `${name} = ${m.groups[name]}\n`;
        });
      }
      output += "\n";
    });
    
    document.getElementById('output').innerText = output;
    &lt;pre id="output"&gt;&lt;/pre&gt;

    但我认为你会有不同的路径长度。因此,在这种情况下,您可以只使用正则表达式来匹配斜杠之间的项目,并且您知道最后一个是您的项目名称。

    const regex = /[^\/]+/g;
    let output = '';
    
    const paths = [
      'dir1/dir2/dir3/projectname',
      'first/second/third/fourth/another-project-name'
    ];
    
    paths.forEach(path => {
      output += `${path}\n`;
      let m;
      let pieces = [];
      while ((m = regex.exec(path)) !== null) {
        pieces.push(m[0]);
      }
      let projectName = pieces.pop();
      pieces.forEach(piece => {
        output += `path item = ${piece}\n`;
      });
      output += `project name = ${projectName}\n\n`;
    });
    
    document.getElementById('output').innerText = output;
    &lt;pre id="output"&gt;&lt;/pre&gt;

    【讨论】:

    • 谢谢,我需要另一件事,我只想保存 var2var1var3projectname 删除。实际上,忽略它们
    • @pyramid13 好吧,一周前你的问题还不是很清楚!所以如果我理解你只需要一个匹配路径第二部分的正则表达式?如果是,那么(?&lt;=^[^\/]+\/)[^\/]+(?=\/.*) 会找到它。我正在使用带有(?&lt;=^[^\/]+\/) 的正向lookbehind 来查找起始字符串,一些字符不是斜线,然后是斜线。这意味着我们要查找的内容前面是第一个文件夹和斜线。然后[^\/]+ 是匹配您想要的文件夹编号 2。最后一个正向前瞻(?=\/.*) 是仅匹配文件夹 2,如果它后跟一个斜杠,然后是任何字符。
    • 抱歉,@patrick 您自己检查过这个正则表达式吗?我有语法错误
    • 哦,我知道这取决于正则表达式引擎。实际上,它适用于 ECMAScript,但不适用于 PCRE,因为由于 +,lookbehind 没有固定大小。可以使用群吗?如果是,那么我们可以使用^[^\/]+\/([^\/]+)\/.*,然后根据您的引擎,您可以使用$1\1 将其读取或替换为组号1。在这里测试:regex101.com/r/dICHYc/1
    • 我找到了另一个正则表达式。我得到了帮助 regex101.com 聊天。与/(?&lt;value&gt;[^/]+)\/.*/ 提取dir1/^[^\/]+\/([^\/]+)/ 提取dir2
    猜你喜欢
    • 2021-08-18
    • 2019-12-02
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2020-03-05
    相关资源
    最近更新 更多