Как разбить текст на первый штрих и подчеркивание с помощью регулярных выражений - PullRequest
1 голос
/ 02 апреля 2019

У меня есть следующие отдельные входы:

MCMASTER - 94510A260_M8 EXPAND INSERT FOR PLASTICS
MISUMI-AIPOK6-20
MISUMI - AIPOK6-20
J-5858-01_MISUMI-AIPOK6-20
J-5858-01_MISUMI - AIPOK6-20
J-XXXX_MISUMI-AIPOK6-20
J-5858_MISUMI - AIPOK6-20

Мне нужно разделить каждую строку, чтобы получить поставщика, номер детали и описание.

Я использую:

(J-\d{4}-\d{2}\D{0,1}_|J-XXXX-\d{2}\D{0,1}_|J-\d{4}_){0,1}(.*?)-(.*)_{0,1}(.*)

как шаблон, но он не работает на первой строке ввода (начиная с MCMASTER.) Он работает на всех остальных.

Я ожидаю получить что-то подобное для первого ввода:

Group#1 "Undefined"
Group#2 MCMASTER
Group#3 94510A260
Group#4 M8 EXPAND INSERT FOR PLASTICS

1 Ответ

0 голосов
/ 03 апреля 2019

Вы должны быть в состоянии использовать это:

(J-(?:\d{4}|XXXX)\D?(?:-\d{2})?_)?(.*?)-([^_\n\r]*)_?(.*)

См. Здесь: https://regex101.com/r/yljBDA/1

Я заменил все ваши {0,1} на более короткие ?, а также сжал ваш первыйНемного захвата группы с использованием некоторых групп без захвата.

Я могу сказать, что (.*)_{0,1}(.*) в тексте 94510A260_M8 EXPAND INSERT FOR PLASTICS не даст желаемого эффекта, поскольку .* является жадным;то есть он захватывает столько, сколько может.Моим первоначальным инстинктом было сделать первый захват нежадным с .*?, но по какой-то причине это не сработало.Поэтому я просто притворялся, используя класс отрицательных символов [^_\n\r]*.Если вы работаете с этим вводом построчно, вы сможете сократить его до [^_].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...