使用Java中的正则表达式拆分具有转义序列的字符串

rgx*_*rgx 10 java regex split

要拆分的字符串

abc:def:ghi\:klm:nop
Run Code Online (Sandbox Code Playgroud)

字符串应基于":"分割,"\"是转义字符.所以"\:"不应被视为令牌.

split(":")给出

[abc]
[def]
[ghi\]
[klm]
[nop]
Run Code Online (Sandbox Code Playgroud)

必需的输出是字符串数组

[abc]
[def]
[ghi\:klm]
[nop]
Run Code Online (Sandbox Code Playgroud)

如何才能被忽略

Gum*_*mbo 16

使用后面的断言:

split("(?<!\\\\):")
Run Code Online (Sandbox Code Playgroud)

只有在没有前面的情况下才会匹配\.使用双重转义\\\\是必需的,因为字符串声明需要一个,正则表达式需要一个.

但请注意,如果您希望允许令牌以反斜杠结尾,则不允许您转义反斜杠.要做到这一点,你必须先用所有双反斜杠替换

string.replaceAll("\\\\\\\\", ESCAPE_BACKSLASH)
Run Code Online (Sandbox Code Playgroud)

(其中ESCAPE_BACKSLASH是一个不会出现在输入中的字符串)然后,在使用look-behind断言进行拆分后,将ESCAPE_BACKSLASH字符串替换为带有未转义的反斜杠

token.replaceAll(ESCAPE_BACKSLASH, "\\\\")
Run Code Online (Sandbox Code Playgroud)