Java分裂正在吞噬我的角色
我有一个这样的字符串。String str = "la$le\\$li$lo"
我想拆分它以获得以下输出。\$ 是 $转义的,因此应将其保留在输出中。"la","le\\$li","lo"
但是当我做你得到.str.split("[^\\\\]\\$")
"l","le\\$l","lo"
从我得到的正则表达式是匹配a$和i$然后删除。关于如何让我的角色回来的任何想法?
谢谢
我有一个这样的字符串。String str = "la$le\\$li$lo"
我想拆分它以获得以下输出。\$ 是 $转义的,因此应将其保留在输出中。"la","le\\$li","lo"
但是当我做你得到.str.split("[^\\\\]\\$")
"l","le\\$l","lo"
从我得到的正则表达式是匹配a$和i$然后删除。关于如何让我的角色回来的任何想法?
谢谢
使用零宽度匹配断言:
String str = "la$le\\$li$lo";
System.out.println(java.util.Arrays.toString(
str.split("(?<!\\\\)\\$")
)); // prints "[la, le\$li, lo]"
正则表达式本质上是
(?<!\\)\$
它使用否定的 lookbehind 来断言没有前面的 。\
简单的句子拆分,保留标点符号:
String str = "Really?Wow!This.Is.Awesome!";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[.!?])")
)); // prints "[Really?, Wow!, This., Is., Awesome!]"
将长字符串拆分为固定长度的部分,使用\G
String str = "012345678901234567890";
System.out.println(java.util.Arrays.toString(
str.split("(?<=\\G.{4})")
)); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
使用前视/前瞻组合:
String str = "HelloThereHowAreYou";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[a-z])(?=[A-Z])")
)); // prints "[Hello, There, How, Are, You]"
a$ 和 i$ 被删除的原因是正则表达式匹配任何不是“\”后跟“$”的字符。您需要使用零宽度断言[^\\]\$
这与人们试图找到q不跟着u的问题是一样的。
在正确的正则表达式处的第一次切割是 (在 java 中 )/(?<!\\)\$/
"(?<!\\\\)\\$"
class Test {
public static void main(String[] args) {
String regexp = "(?<!\\\\)\\$";
System.out.println( java.util.Arrays.toString( "1a$1e\\$li$lo".split(regexp) ) );
}
}
收益 率:[1a, 1e\$li, lo]