正则表达式 - 仅限4个字符行的某个数字

时间:2016-08-29 14:02:44

标签: regex

我试图制作正则表达式,它将从只有四个字符的行块中找到某个数字(更准确地说是字符" 4"):0,1,2,3 ,4或字母M(后来替换它,但我会在记事本++中这样做)。

我收到了一些像这样的字符的文件:

2000
0400
01M0
0.476
0100
,
0000
14M0
0000

我想找到数字" 4",但只有四个字符的行,所以我只与'#34; 4"从行:

0400
14M0

我不想要" 4"从0.476开始。此外,四个字符行只有数字0,1,2,3,4或字母M.

我尝试了,但结尾只有表达式显示我与" 4"的整行,例如:

  

^ [0123M] {0,3} 4+ [0123M] {0,3} $

     

^ [\ DM] 4 [\ DM] $

我无法仅提取" 4"从这些方面来看。试过一些教程,但我太傻了;)我可以在一些python脚本中用两个单独的正则表达式来做,但我更喜欢用notepad ++用一个表达式来做。

[编辑] 对不起,我说这个不清楚。 我想提取" 4",用记事本++中的另一个数字(" 2")替换它,即。从     0400     14M0 至     0200     12M0

1 个答案:

答案 0 :(得分:0)

您可以使用

查找内容^(?=[0-4M]{4}$)([0-4M]*?)4
替换为${1}2

或更多"优雅"变化:

查找内容^(?=[0-4M]{4}$)[0-3M]*\K4
替换为2

重点是我们需要确保我们只有一条符合条件的行与正向前瞻(?=[0-4M]{4}$)(它检查一行是否只有4个数字或数字M ),然后我们4之前的部分捕获到第1组(稍后将使用${1}反向引用重新插入到结果中),并4只是匹配,没有捕获(见周围没有())。

由于您需要使用反向引用后的数字替换,我们需要使用花括号将组ID括在反向引用中。

详细

  • ^ - 开始行
  • (?=[0-4M]{4}$) - 必须有4个字符,01234或{{1}到行尾
  • M - 第1组捕获零个或多个允许的字符,但尽可能少直到第一个
  • ([0-4M]*?) - 数字4

替代方案:

  • 4 - 匹配[0-3M]*0123,零次或多次,直至
  • M - \K4,但匹配中省略了4之前匹配的内容,因此我们只需要替换为4

如果您想要替换多个2,可以使用此模式变体

4

此处,(?:^(?=[0-4M]{4}$)|(?!^)\G)[0-4M]*?\K4 部分会找到您需要的行(或上次成功匹配的结尾 - (?:^(?=[0-4M]{4}$)|(?!^)\G)),然后(?!^)\G将再次消耗0个以上的允许字符,尽可能少,直到第一个[0-4M]*? 4将省略在匹配中仅留下\K的消费字符。因此,替换将只是4

enter image description here