我试图制作正则表达式,它将从只有四个字符的行块中找到某个数字(更准确地说是字符" 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
答案 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个字符,0
,1
,2
,3
,4
或{{1}到行尾M
- 第1组捕获零个或多个允许的字符,但尽可能少直到第一个([0-4M]*?)
- 数字4
。替代方案:
4
- 匹配[0-3M]*
,0
,1
,2
或3
,零次或多次,直至M
- \K4
,但匹配中省略了4
之前匹配的内容,因此我们只需要替换为4
。 如果您想要替换多个2
,可以使用此模式变体:
4
此处,(?:^(?=[0-4M]{4}$)|(?!^)\G)[0-4M]*?\K4
部分会找到您需要的行(或上次成功匹配的结尾 - (?:^(?=[0-4M]{4}$)|(?!^)\G)
),然后(?!^)\G
将再次消耗0个以上的允许字符,尽可能少,直到第一个[0-4M]*?
,但 4
将省略在匹配中仅留下\K
的消费字符。因此,替换将只是4
。