我在使用InfluxDB后端的Grafana中过滤标签时遇到问题。我正在尝试过滤掉标记的前8个字符和后2个字符,但是我遇到了一个非常奇怪的问题。
这里是一些名字...
- GYPSKSVLMP2L1HBS135WH
- GYPSKSVLMP2L2HBS135WH
- RSHLKSVLMP1L1HBS045RD
- RSHLKSVLMP35L1HBS135WH
- RSHLKSVLMP35L2HBS135WH
只想返回如下内容:
- MP8L1HBS225
- MP24L2HBS045
我首先开始使用以下表达式:
[MP]。*
但是它只返回148个中的以下一个:
- PAYNKSVLMP27L1HBS045RD
- PAYNKSVLMP27L1HBS135WH
- PAYNKSVLMP27L1HBS225BL
- PAYNKSVLMP27L1HBS315BR
答案 0 :(得分:1)
模式[MP].*
匹配M或P,然后匹配任何字符,直到字符串的末尾不考虑任何字符,数字或量化数字。
如果您想匹配MP
,并且值不以数字结尾,但是匹配的最后一个数字应该是数字,则可以使用:
MP[A-Z0-9]+[0-9]
如果支持先行,则也可以使用:
MP[A-Z0-9]+(?=[A-Z0-9]{2}$)
答案 1 :(得分:0)
尝试使用正则表达式:(?<=\w{8})\w+(?=\w{2})
答案 2 :(得分:0)
您甚至可能不想触摸MP。您可以简单地定义一个左右边界,就像您的问题一样,然后在其间滑动所有内容,可能更快,例如an expression类似于:
(\w{8})(.*)(\w{2})
,您可以简单地使用$2
对其进行调用。这是第二个捕获组,只是为了易于替换。
此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. ");