REGEX - NP ++ - удаление отступов 0 из подгрупп кода с одним регулярным выражением - PullRequest
0 голосов
/ 24 января 2019

Это мой первый вопрос в теме, заранее спасибо за вашу помощь и время, которое вы тратите на чтение меня
Я работаю под 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 находятся в начале второй группыи в конце третьей группы.Количество отступов 0s варьируется ...

Непривлекательное решение

Под 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})

Последний вопрос

Знаете ли вы более привлекательное и умное регулярное выражение для достижения намеченного результата?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете сделать это так

(?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} )
...