这是我的第一个主题问题,在此先感谢您的帮助以及您花时间阅读我的内容
我在NP ++下工作,尝试一些正则表达式
我想用比下面的更有吸引力和更聪明的正则表达式将这些行(从)转换为格式化的行(至)(请参阅无吸引力的解决方案)
(来自)=>(至)
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可以达到预期的结果吗?
答案 0 :(得分:0)
您可以这样做
(?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} )