2017-02-09 30 views
1

匹配我有以下字符串:分割字符串和模式在Java中

MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD 

我想每一個KR遇到,然後在由P只是時間分割這樣的字符串。

因此,我想下面的輸出:

MYLMFILLAAGCSK 
MYLLFINNAARPFASSTK 
AASTVVTPHHSYTSKPHHSTTSHCK 
SSD 

起初,我嘗試使用簡單的Java .split()功能,但我無法得到期望的結果。因爲我真的不知道如何在.split()函數中提及它,如果在KR後面有P,則不要分割它。

我看了其他類似的問題,他們建議使用模式匹配,但我不知道如何在這種情況下使用它。

+0

他們是'**畝**','** P **'等文字?還是你把它們放在了大膽的地方讓我們看到它們? – BackSlash

+0

不,我只是用粗體表示,以便您可以看到 –

+0

您可以手動檢查您的字符串,例如,如果單獨包含K或R,則使用'charAt()',然後使用'substring()'和發現的位置來拆分字符串。 – IQV

回答

1

剛剛嘗試這個正則表達式:

(K)([^P]|$) 

替換每個匹配
\1\n\2 

如下圖所示demo。不需要負向預測。但是不能將它與分割一起使用,因爲它應該在K之後消除不爲P的字符。

你可以做第一個變換類似上面,然後.split("\n"); 所以它應該是:

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

您可以使用拆分:

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

因爲要保持你拆分輸入,您必須使用看後面,它斷言沒有消耗。有兩種外觀變通:

  • (?<=[KR])意思是 「前一個字符或者是KR
  • (?!P)意思是 「下一個字符是一個P

此正則表達式匹配之間你想分裂的字符。


一些測試代碼:

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

輸出:

MYLMFILLAAGCSK 
MYLLFINNAARPFASSTK 
AASTVVTPHHSYTSKPHHSTTSHCK 
SSD 
+0

經過許多關於**消極鎖定斷言**的閱讀後,我現在認識到如何纔能有用。謝謝:) –

+0

謝謝@波希米亞,你的答案幫了我很多 –