REGEX - NP++ - 使用一个正则表达式从代码的子组中删除填充 0
REGEX - NP++ - removing padding 0s from subgroups of a code with one regex
这是我的第一个主题问题,在此先感谢您的帮助和您花时间阅读我
我在 NP++ 下工作来尝试一些 Regex
我想要什么
我想用 一个比我下面的更有吸引力和更智能的正则表达式 将这些行 (from) 转换为那些格式化的行 (to)(参见 没有吸引力的解决方案)
(从)=>(到)
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;
- 撤回第二组开头的所有padding 0(第二组至少要有一位)
H04B 1/240000;
- 撤掉第三组末尾的所有padding 0(第三组至少要有两位数)
H04B 1/24;
所以被认为无用的0在第二组的开头和第三组的结尾。填充 0 的数量在变化...
没有吸引力的解决方案
在NP++下,我发现了一个我觉得没有吸引力的解决方案
在 'Search' 字段中:
([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}(;)
在 'Replace' 字段中:
\/
解释用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})
最后一题
你知道一个更有吸引力和更聪明的正则表达式来达到目标结果吗?
你可以这样做
(?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} )
这是我的第一个主题问题,在此先感谢您的帮助和您花时间阅读我
我在 NP++ 下工作来尝试一些 Regex
我想要什么
我想用 一个比我下面的更有吸引力和更智能的正则表达式 将这些行 (from) 转换为那些格式化的行 (to)(参见 没有吸引力的解决方案)
(从)=>(到)
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;
- 撤回第二组开头的所有padding 0(第二组至少要有一位)
H04B 1/240000;
- 撤掉第三组末尾的所有padding 0(第三组至少要有两位数)
H04B 1/24;
所以被认为无用的0在第二组的开头和第三组的结尾。填充 0 的数量在变化...
没有吸引力的解决方案
在NP++下,我发现了一个我觉得没有吸引力的解决方案
在 'Search' 字段中:
([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}(;)
在 'Replace' 字段中:
\/
解释用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})
最后一题
你知道一个更有吸引力和更聪明的正则表达式来达到目标结果吗?
你可以这样做
(?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} )