这是我的第一个主题问题,在此先感谢您的帮助以及您花费的时间来阅读我
我在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} )

09-11 17:17