正则表达式,用于匹配前{N}个字符和后{M}个字符

时间:2019-05-06 15:58:46

标签: regex regex-group regex-greedy

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

这里是一些名字...

  
      
  • GYPSKSVLMP2L1HBS135WH
  •   
  • GYPSKSVLMP2L2HBS135WH
  •   
  • RSHLKSVLMP1L1HBS045RD
  •   
  • RSHLKSVLMP35L1HBS135WH
  •   
  • RSHLKSVLMP35L2HBS135WH
  •   

只想返回如下内容:

  
      
  • MP8L1HBS225
  •   
  • MP24L2HBS045
  •   

我首先开始使用以下表达式:

  

[MP]。*

但是它只返回148个中的以下一个:

  
      
  • PAYNKSVLMP27L1HBS045RD
  •   
  • PAYNKSVLMP27L1HBS135WH
  •   
  • PAYNKSVLMP27L1HBS225BL
  •   
  • PAYNKSVLMP27L1HBS315BR
  •   

3 个答案:

答案 0 :(得分:1)

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

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

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

Regex demo

如果支持先行,则也可以使用:

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

Regex demo

答案 1 :(得分:0)

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

Demo

答案 2 :(得分:0)

您甚至可能不想触摸MP。您可以简单地定义一个左右边界,就像您的问题一样,然后在其间滑动所有内容,可能更快,例如an expression类似于:

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

,您可以简单地使用$2对其进行调用。这是第二个捕获组,只是为了易于替换。

enter image description here

此图显示了表达式的工作方式: enter image description here

性能

此JavaScript代码段使用简单的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.  ");