Java分裂正在吃我的angular色

我有这样的String str = "la$le\\$li$lo"

我想分割它得到下面的输出"la","le\\$li","lo" 。 \ $是一个$转义,所以它应该留在输出中。

但是当我做str.split("[^\\\\]\\$")得到"l","le\\$l","lo"

从我得到我的正则expression式是匹配一个$和我和去除然后。 任何想法如何让我的人物回来?

谢谢

使用零宽度匹配断言:

  String str = "la$le\\$li$lo"; System.out.println(java.util.Arrays.toString( str.split("(?<!\\\\)\\$") )); // prints "[la, le\$li, lo]" 

正则expression式本质上是

 (?<!\\)\$ 

它使用负面的后视来断言没有前面的\

也可以看看

  • regular-expressions.info/Lookarounds

更多断言的例子

简单的句子拆分,保留标点符号:

  String str = "Really?Wow!This.Is.Awesome!"; System.out.println(java.util.Arrays.toString( str.split("(?<=[.!?])") )); // prints "[Really?, Wow!, This., Is., Awesome!]" 

将长string拆分成固定长度的部分,使用\G

  String str = "012345678901234567890"; System.out.println(java.util.Arrays.toString( str.split("(?<=\\G.{4})") )); // prints "[0123, 4567, 8901, 2345, 6789, 0]" 

使用lookbehead / lookahead组合:

  String str = "HelloThereHowAreYou"; System.out.println(java.util.Arrays.toString( str.split("(?<=[az])(?=[AZ])") )); // prints "[Hello, There, How, Are, You]" 

相关问题

  • 你可以在string拆分中使用零宽度匹配正则expression式吗?
  • 在向后看的反向引用
  • 如何将CamelCase转换为Java中的可读名称?

$和i $被删除的原因是regexp [^\\]\$匹配任何不是'\'的字符,后跟'$'。 你需要使用零宽度断言

这是人们试图find没有跟着你的同样的问题。

在适当的正则expression式的第一个剪切是/(?<!\\)\$/"(?<!\\\\)\\$" in 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]

您可以先尝试用另一个string(例如$(“%24”)的URL编码)replace“\ $”,然后拆分:

 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$