拆分字符串& Java中的模式匹配

时间:2017-02-09 11:52:24

标签: java regex split

我有一个以下字符串:

MYLMFILLAAGCSKMYLLFINNAARPFASSTKAASTVVTPHHSYTSKPHHSTTSHCKSSD

我想在每次遇到KR时拆分这样的字符串,除非后跟P

因此,我想要以下输出:

MYLMFILLAAGCSK
MYLLFINNAARPFASSTK
AASTVVTPHHSYTSKPHHSTTSHCK
SSD

起初,我尝试在java中使用简单的.split()函数,但我无法获得所需的结果。因为我真的不知道如何在.split()函数中提及它,如果PK之后有R,则不要拆分。

我已经查看了其他类似的问题,他们建议使用模式匹配,但我不知道如何在这种情况下使用它。

2 个答案:

答案 0 :(得分:6)

您可以使用拆分:

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

因为您希望保留您要拆分的输入,所以必须使用后面的,它会在没有消费的情况下断言 。有两个环顾四周:

  • (?<=[KR])表示&#34;之前的字符为KR&#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");