Regex 用于匹配第一个{N}字符和最后一个{M}字符的正则表达式

Regex 用于匹配第一个{N}字符和最后一个{M}字符的正则表达式,regex,regex-group,regex-greedy,Regex,Regex Group,Regex Greedy,我在使用XDB后端过滤Grafana中的标记时遇到问题。我试图过滤掉标签的前8个字符和最后2个字符,但我遇到了一个非常奇怪的问题 这里有一些名字 吉普赛人VLMP2L1HBS135WH 吉普赛人VLMP2L2HBS135WH RSHLKSVLMP1L1HBS045RD RSHLKSVLMP35L1HBS135WH RSHLKSVLMP35L2HBS135WH 只想返回如下内容: MP8L1HBS225 MP24L2HBS045 我首先使用以下表达式: [MP]* 但它只返回148个值中的

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

这里有一些名字

  • 吉普赛人VLMP2L1HBS135WH
  • 吉普赛人VLMP2L2HBS135WH
  • RSHLKSVLMP1L1HBS045RD
  • RSHLKSVLMP35L1HBS135WH
  • RSHLKSVLMP35L2HBS135WH
只想返回如下内容:

  • MP8L1HBS225
  • MP24L2HBS045
我首先使用以下表达式:

[MP]*

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

  • PAYNKSVLMP27L1HBS045RD
  • PAYNKSVLMP27L1HBS135WH
  • PAYNKSVLMP27L1HBS225BL
  • PAYNKSVLMP27L1HBS315BR

尝试Regex:
(?模式
[MP].
匹配M或p,然后匹配任何字符,直到字符串结束,之后不考虑任何字符、数字或量化数字

如果要匹配
MP
,且值不以数字结尾,但匹配中的最后一个应为数字,则可以使用:

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

如果支持lookaheads,您还可以使用:

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

您甚至可能不想触摸MP。您可以简单地定义一个左右边界,就像您的问题所要求的那样,然后滑动中间的任何东西,这可能会更快,可能类似于:

 (\w{8})(.*)(\w{2})
您可以使用
$2
简单地将其命名。这是第二个捕获组,便于更换

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

演出 这个JavaScript片段使用一个简单的100万次
for
循环来显示这个表达式的性能

repeat=1000000;
开始=日期。现在();
对于(变量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+”\"是一个匹配问题,不尝试提问,在堆栈溢出问题上是离题的。你使用的是什么语言。你描述它的方式我看不出有任何理由使用正则表达式。这是基本的字符串处理。@kvantor-这是怎么离题的。我有一个合法的问题,我完全不懂正则表达式。Grafana要求我使用它们来实现e我想做什么。@Andreas-老实说,我不确定。这是Grafana中变量部分的一部分。Emma,谢谢你。我似乎不知道正则表达式是如何打破这样的分组的。我想我需要提交一份关于他们在Grafana中实现正则表达式的错误报告。这是我在AGSTKSVL BNTNKSVL BRNOKSVL DGLSKSVL GYPSKSVL PAYNKS中的结果VL RCKFKSVL RSHLKSVL SPNGKSVL TWNDKSVL我想我需要提交一份他们在Grafana中实现regex的错误报告。我试过你的,但它没有返回任何东西。Regex101显示它工作得很好。