Java分裂正在吃我的角色

时间:2010-05-12 14:51:53

标签: java regex string split

我有一个像String str = "la$le\\$li$lo"这样的字符串。

我想将其拆分以获得以下输出"la","le\\$li","lo"。 \ $是一个$转义,所以应该留在输出中。

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

从我得到的我的正则表达式匹配$和i $然后删除。知道如何让我的角色回来吗?

由于

4 个答案:

答案 0 :(得分:21)

使用零宽度匹配断言:

    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]"

相关问题

答案 1 :(得分:2)

$和i $被删除的原因是正则表达式[^\\]\$匹配任何不是'\'后跟'$'的字符。您需要使用zero width assertions

这是同样的问题,人们试图找到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]

答案 2 :(得分:1)

您可以先尝试将“\ $”替换为另一个字符串,例如$(“%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)

答案 3 :(得分:0)

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$