【问题标题】:RegEx for matching the first {N} chars and last {M} chars用于匹配前 {N} 个字符和最后 {M} 个字符的正则表达式
【发布时间】:2019-05-06 15:58:45
【问题描述】:

我在使用 InfluxDB 后端过滤 Grafana 中的标签时遇到问题。我正在尝试过滤掉标签的前 8 个字符和后 2 个字符,但我遇到了一个非常奇怪的问题。

这里有一些名字...

  • GYPSKSVLMP2L1HBS135WH
  • GYPSKSVLMP2L2HBS135WH
  • RSHLKSVLMP1L1HBS045RD
  • RSHLKSVLMP35L1HBS135WH
  • RSHLKSVLMP35L2HBS135WH

只想返回这样的东西:

  • MP8L1HBS225
  • MP24L2HBS045

我首先开始使用这个表达式:

[MP].*

但它只返回 148 个中的以下内容:

  • PAYNKSVLMP27L1HBS045RD
  • PAYNKSVLMP27L1HBS135WH
  • PAYNKSVLMP27L1HBS225BL
  • PAYNKSVLMP27L1HBS315BR

【问题讨论】:

  • 在 Stack Overflow 上询问 "Give me a regex that does X" 而没有尝试的问题是题外话。
  • 您使用的是什么语言。你描述它的方式我看不出任何使用正则表达式的理由。这是基本的字符串处理。
  • @kvantor - 这个题外话怎么样。我有一个合法的问题,我是一个正则表达式的菜鸟。 Grafana 要求我使用它们来实现我想要做的事情。 @ Andreas - 老实说,我不确定。它是 Grafana 中变量部分的一部分。

标签: regex regex-group regex-greedy


【解决方案1】:

[MP].* 模式匹配 M 或 P,然后匹配任何字符,直到字符串末尾,不考虑任何字符、数字或量化数字。

如果你想匹配 MP 并且值不是以数字结尾但匹配中的最后一个应该是数字,你可以使用:

MP[A-Z0-9]+[0-9]

Regex demo

如果支持前瞻,您也可以使用:

MP[A-Z0-9]+(?=[A-Z0-9]{2}$)

Regex demo

【讨论】:

    【解决方案2】:

    你可能甚至不想碰 MP。你可以简单地定义一个左右边界,就像你的问题问的那样,然后在这之间滑动可能会更快的所有东西,也许an expression 类似于:

     (\w{8})(.*)(\w{2})
    

    您可以使用$2 简单地调用它。那是第二个捕获组,只是为了方便替换。

    图表

    此图显示了表达式的工作原理:

    性能

    这个 JavaScript sn-p 使用简单的 100 万次 for 循环显示了这个表达式的性能。

    repeat = 1000000;
    start = Date.now();
    
    for (var i = repeat; i >= 0; i--) {
    	var string = "RSHLKSVLMP35L2HBS135WH";
    	var regex = /^(\w{8})(.*)(\w{2})$/g;
    	var match = string.replace(regex, "$2");
    }
    
    end = Date.now() - start;
    console.log("YAAAY! \"" + match + "\" is a match ? ");
    console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");

    【讨论】:

    • 艾玛,谢谢。我似乎无法弄清楚正则表达式是如何破坏这样的组的。
    • 我想我需要为他们在 Grafana 中实现正则表达式提交一份错误报告。这是我的结果 AGSTKSVL BNNKSVL BRNOKSVL DGLSKSVL GYPSKSVL PAYNKSVL RCKFKSVL RSHLKSVL SPNGKSVL TWNDKSVL
    【解决方案3】:

    试试正则表达式:(?<=\w{8})\w+(?=\w{2})

    Demo

    【讨论】:

    • 我想我需要为他们在 Grafana 中实现正则表达式提交一份错误报告。我试过你的,它没有返回任何东西。 Regex101 表明它运行良好。
    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2012-01-26
    • 2012-09-17
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多