[英]Java split is eating my characters
我有一个像String str = "la$le\\\\$li$lo"
这样的String str = "la$le\\\\$li$lo"
。
我想拆分它以获得以下输出"la","le\\\\$li","lo"
。 \\ $是一个$转义所以它应该留在输出中。
但是当我做str.split("[^\\\\\\\\]\\\\$")
得到"l","le\\\\$l","lo"
。
从我得到的我的正则表达式匹配$和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]"
使用lookbehind / lookahead组合:
String str = "HelloThereHowAreYou";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[a-z])(?=[A-Z])")
)); // prints "[Hello, There, How, Are, You]"
$和i $被删除的原因是regexp [^\\\\]\\$
匹配任何不是'\\'后跟'$'的字符。 您需要使用零宽度断言
这是同样的问题,人们试图找到q而不是你。
在正确的正则表达式中的第一个剪切是/(?<!\\\\)\\$/
(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]
您可以尝试先用另一个字符串替换“\\ $”,例如$(“%24”)的URL编码,然后拆分:
String splits[] = str.replace("\$","%24").split("[^\\\\]\\$");
for(String str : splits){
str = str.replace("%24","\$");
}
更一般地说,如果str是由类似的东西构造的
str = a + "$" + b + "$" + c
然后你可以在将它们附加到一起之前URLEncode a,b和c
import java.net.URLEncoder.encode;
...
str = encode(a) + "$" + encode(b) + "$" + encode(c)
import java.util.regex.*;
public class Test {
public static void main(String... args) {
String str = "la$le\\$li$lo";
Pattern p = Pattern.compile("(.+?)([^\\\\]\\$)");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
}
给
l
a$
le\$l
i$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.