2017-02-09 12 views
1

У меня есть следующая строка:Разбиение строки и шаблон соответствия в Java

MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD 

Я хочу, чтобы разбить такой струны каждый раз, когда K или R, когда встречается, за исключением того, когда следует P.

Поэтому я хочу следующий вывод:

MYLMFILLAAGCSK 
MYLLFINNAARPFASSTK 
AASTVVTPHHSYTSKPHHSTTSHCK 
SSD 

На первом, я попытался с помощью простого .split() функции в Java, но я не мог получить желаемый результат. Потому что я действительно не знаю, как упомянуть об этом в функции .split(), чтобы не разделить, если есть P сразу после K или R.

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

+0

ли они '** K **,' ** P ** 'и т.д., как текст ? Или вы оставили их смелыми для нас, чтобы их увидеть? – BackSlash

+0

Нет, я просто сделал их жирным шрифтом, чтобы вы могли видеть –

+0

Вы можете проверить свою строку вручную, например. с 'charAt()', если он содержит только K или R, а затем использовать 'substring()' и найденные позиции для разделения вашей строки. – IQV

ответ

1

Просто попробуйте это регулярное выражение:

(K)([^P]|$) 

и заменить каждое совпадение по

\1\n\2 

как показано в следующей таблице: demo. Никаких отрицательных результатов не требуется. Но вы не можете использовать его с split, так как он должен устранить символ P после K.

Вы можете сделать первый преобразовываться как один из приведенных выше, а затем .split("\n"); так и должно быть:

"MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSDK" 
    .subst("(K)([^P]|$)", "\1\n\2").split("\n"); 
6

Вы можете использовать раскол:

String[] parts = str.split("(?<=[KR])(?!P)"); 

Потому что вы хотите держать вход вы разделяя, вы должны использовать вид сзади, утверждающую без потребляющего. Есть два взгляд обходные:

  • (?<=[KR]) означает «предыдущий символ либо K или R»
  • (?!P) означает «следующий символ является неP»

Это регулярное выражение соответствует между символами, в которых вы хотите разбить.


Некоторые тест-код:

String str = "MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD"; 
Arrays.stream(str.split("(?<=[KR])(?!P)")).forEach(System.out::println); 

Выход:

MYLMFILLAAGCSK 
MYLLFINNAARPFASSTK 
AASTVVTPHHSYTSKPHHSTTSHCK 
SSD 
+0

После многих многих чтений о ** отрицательном утверждении блокировки вперед. Теперь я понимаю, как это может быть полезно. Спасибо :) –

+0

Спасибо @Bohemian, ваш ответ мне очень помог –