2017-01-14 2 views
-1

У меня есть сценарий, где мне нужно разбить нижнюю строку ввода на основе ключевых слов с использованием регулярного выражения.Как разбить строку с помощью ключевых слов с помощью regex

Ключевые слова: UPRCAS, REPLC, LOWCAS и TUPIL.

String input = "UPRCAS-0004-abcdREPLC-0003-123TUPIL-0005-adf2344LOWCAS-0003-ABCD"; 

Выход должен быть следующим

UPRCAS-00040-abcd 
REPLC-0003-123 
TUPIL-0005-adf2344 
LOWCAS-00030-ABCD 

Как я могу добиться этого с помощью Java регулярных выражений.

Я попытался использовать split by '-' и с помощью regex, но оба подхода дают массив строк, и я снова обрабатываю каждую строку и объединяю 3 строки вместе, чтобы сформировать UPRCAS-00040-abcd. Я чувствовал, что это не эффективный способ сделать, поскольку он требует дополнительного массива и обрабатывает их.

String[] tokens = input.split("-"); 
String[] r = input.split("(?=\\p{Upper})"); 

Пожалуйста, дайте мне знать, если мы сможем разбить строку, используя регулярное выражение, основанное на ключевом слове. В основном мне нужно извлечь строку между границей ключевых слов.

Edited вопрос после того, как понимание ограничения существующей проблемы


  • Регулярное выражение должно быть общим для извлечения строки из ввода между символами верхнего регистра
  • Регулярное выражение не содержит ключевых слов для разделения строки.

Я понял, что это плохая идея добавлять новое ключевое слово каждый раз в шаблон регулярного выражения для поиска. Мое ожидание должно быть как можно более общим.

Спасибо всем за ваше время. Действительно ценю это.

+0

* Комментарий к отредактированной вопрос: * Если разделить на прописных символов, ваш 4-й значение будет разделено на 'LOWCAS-00030-' и 'ABCD'.Если вы не можете * гарантировать *, что все значения ожидают, что последний будет * никогда * использовать символы верхнего регистра, кроме префикса, использование UPPERCASE не будет работать. – Andreas

+0

Да. В этом случае мне нужно сравнить ключевое слово с каждым извлечением выходной строки. –

ответ

0

Вы можете попробовать это регулярное выражение:

\w+-\w+-(?:[a-z0-9]+|[A-Z]+) 

Демо: https://regex101.com/r/etKBjI/3

+0

Вопрос явно говорит * «Ключевые слова: UPRCAS, REPLC, LOWCAS и TUPIL» *, но ваше регулярное выражение игнорирует это и пытается вывести логику по чувствительности к регистру, однако это работает только для данного примера, потому что первые 3 значения не имеют прописных в третьей части. Это регулярное выражение не удастся сильно, если вы просто измените порядок 4 значений. Если требование состоит в том, чтобы искать 4 ключевых слова, то не поиск ключевых слов будет недействительным для всех возможных входов. – Andreas

+0

@MYGz спасибо за 2 цента. Я нашел это решение довольно интересным, потому что это помогает мне разбивать входные данные на группу строк без указания ключевого слова. Infact Я перепроектирую код на основе этого регулярного выражения. Я понял, что, предположим, завтра я добавил 100 ключевых слов, я не должен менять выражение каждый раз. Код должен быть масштабируемым. Я отредактирую вопрос. –

+0

Спасибо @Anddeas за указание на недостатки. Я пришел в jiffy и проигнорировал все, кроме ввода и вывода, поскольку это был вопрос Java, и я Python dev. Удалил бы это на ваш комментарий, но поскольку OP может видеть другую перспективу, я оставлю это. – MYGz

3

Split, используя следующее регулярное выражение:

(?=UPRCAS|REPLC|LOWCAS|TUPIL) 

(?=xxx) является zero-width positive lookahead, что означает, что он соответствует пустое пространство непосредственно предшествующий одному из четырех ключевых слов.

См Regular-Expressions.info для получения дополнительной информации: Lookahead and Lookbehind Zero-Length Assertions

Test

String input = "UPRCAS-0004-abcdREPLC-0003-123TUPIL-0005-adf2344LOWCAS-0003-ABCD"; 
String[] output = input.split("(?=UPRCAS|REPLC|LOWCAS|TUPIL)"); 
for (String value : output) 
    System.out.println(value); 

Выход

UPRCAS-0004-abcd 
REPLC-0003-123 
TUPIL-0005-adf2344 
LOWCAS-0003-ABCD 
Смежные вопросы