我有一个以下字符串:
MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD
我想在每次遇到K
或R
时拆分这样的字符串,除非后跟P
。
因此,我想要以下输出:
MYLMFILLAAGCSK
MYLLFINNAARPFASSTK
AASTVVTPHHSYTSKPHHSTTSHCK
SSD
起初,我尝试在java中使用简单的.split()
函数,但我无法获得所需的结果。因为我真的不知道如何在.split()
函数中提及它,如果P
或K
之后有R
,则不要拆分。
我已经查看了其他类似的问题,他们建议使用模式匹配,但我不知道如何在这种情况下使用它。
答案 0 :(得分:6)
您可以使用拆分:
String[] parts = str.split("(?<=[KR])(?!P)");
因为您希望保留您要拆分的输入,所以必须使用后面的,它会在没有消费的情况下断言 。有两个环顾四周:
(?<=[KR])
表示&#34;之前的字符为K
或R
&#34; (?!P)
表示&#34;下一个字符不 a P
&#34; 此正则表达式匹配要分割的字符之间的。
一些测试代码:
String str = "MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD";
Arrays.stream(str.split("(?<=[KR])(?!P)")).forEach(System.out::println);
输出:
MYLMFILLAAGCSK
MYLLFINNAARPFASSTK
AASTVVTPHHSYTSKPHHSTTSHCK
SSD
答案 1 :(得分:1)
试试这个正则表达式:
(K)([^P]|$)
并用
替换每个匹配\1\n\2
如以下demo所示。不需要负面的预测。但是你不能将它与split一起使用,因为它也应该消除P
之后的K
字符。
您可以像上面那样进行第一次转换,然后.split("\n");
所以它应该是:
"MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSDK"
.subst("(K)([^P]|$)", "\1\n\2").split("\n");