这是我的第一个主题问题,在此先感谢您的帮助以及您花费的时间来阅读我
我在NP ++下工作,尝试一些Regex
我想要的是
我想使用下面比我更有吸引力和更聪明的正则表达式将这些行(从)转换为格式化的行(至)(请参阅不具吸引力的解决方案)
(从)=>(到)
H04B0001240000; => H04B 1/24;
H04B0010300000; => H04B 10/30;
H04B0011301000; => H04B 11/301;
H04B0111300000; => H04B 111/30;
H04B0101303400; => H04B 101/3034;
H04B0100300010; => H04B 100/30001;
H04B0110300000; => H04B 110/30;
如何进行 ?
-对于给定的代码,规则是
H04B0001240000;
-分为三部分4,4,6
H04B 0001/240000;
-在第二组的开头处撤回所有填充0(第二组应至少有一位数字)
H04B 1/240000;
-在第三组末尾提取所有填充0(第三组应至少包含两位数)
H04B 1/24;
因此,认为无用的0位于第二组的开始和第三组的末尾。填充0的数量在变化...
没有吸引力的解决方案
在NP ++下,我找到了一种没有吸引力的解决方案
在“搜索”字段中:
([A-Z])((?:0{3}([1-9]))|(?:0{2}([1-9][0-9]))|(?:0([1-9][0-9]{2})))([0-9]{2})([0-9]*[1-9])?0{1,4}(;)
在“替换”字段中:
\1 \3\4\5\/\6\7\8
H04B 0001/240000;
的解释==============================
([A-Z])
表示从A到Z的一个大写字母,与第一组的最后一个字母(H04B
)匹配((?:0{3}([1-9]))|(?:0{2}([1-9][0-9]))|(?:0([1-9][0-9]{2})))
应该匹配0002或0020或0201,但不能匹配2011。它与检测第二组(0001
)有关([0-9]{2})([0-9]*[1-9])?0{1,4}(;)
与第三组6位数字(240000
)有关,目的是在最后丢弃所有填充0。第三组至少应包含两位数字([0-9] {2})
最后的问题
您知道一种更有吸引力,更聪明的Regex可以达到预期的结果吗?
最佳答案
你可以这样(?m)^(\S{4})0*(\d\d*?)(?<=^.{8})(\d{2}\d*?)0*;
https://regex101.com/r/7pTjkB/2
(?m)
^
( \S{4} ) # (1)
0*
( \d \d*? ) # (2)
(?<= ^ .{8} )
( # (3 start)
\d{2}
\d*?
) # (3 end)
0*
; # Or, (?<= ^ .{14} )
或者像这样
(?m)^(\S{4})0*(\d\d*?)(?<=^.{8})(\d{2}\d*?)0*(?<=^.{14})
https://regex101.com/r/7pTjkB/3
(?m)
^
( \S{4} ) # (1)
0*
( \d \d*? ) # (2)
(?<= ^ .{8} )
( # (3 start)
\d{2}
\d*?
) # (3 end)
0*
(?<= ^ .{14} )