Java:如何在忽略其他部分的同时拆分字符串

时间:2019-06-13 03:30:01

标签: java regex string

我有一个用连字符分隔的字符串键列表,如下所示:

String s = "key-keyone-keytwo";

当我使用s.split("-")时,正如人们期望的那样,我得到了一个[key, keyone, keytwo]数组。出现问题的地方是当我有一个包含破折号的钥匙时。我决定我将使用连字符的键转义为:

String s1 = "key-key'-'one-keytwo";

当我用连字符分割String s1时,我的结果应该是[key, key-one, keytwo]

作为分割的正则表达式,我将放置什么以便使其满足上述条件。我对正则表达式模式不太熟悉,因此说明也很棒。

更新:“密钥”一词不会被硬编码。可以是任何字符串。理想情况下,我想要类似"someString->anotherString->another"的东西,在那里我可以像Java lambda一样拆分箭头->如果出于任何原因,键字符串包含箭头,都可以像"some'->'string->anotherString->another"那样转义,然后变成:[some->string, anotherString, another],我知道它有点复杂,但是任何建议都会帮助!

2 个答案:

答案 0 :(得分:1)

您想在-上拆分,但不想在'-'上拆分,但是同时您想用'-'替换-。您不能仅通过split()调用来执行此操作,因为它不能进行替换。

您可以通过在{<1>}之前的-后面加上'进行拆分来进行拆分:

s.split("(?<!')-|-(?!')")

测试

public static void main(String[] args) {
    test("key-keyone-keytwo");
    test("key-key-'one-keytwo");
    test("key-key'-one-keytwo");
    test("key-key'-'one-keytwo");
}
private static void test(String str) {
    String[] split = str.split("(?<!')-|-(?!')");
    System.out.println(Arrays.toString(split));
}

输出

[key, keyone, keytwo]
[key, key, 'one, keytwo]
[key, key', one, keytwo]
[key, key'-'one, keytwo]

如您所见,它没有在'-'上分裂,但是结果仍然带有“转义符”,因此您需要进行后续操作以解决此问题:

String[] split = str.split("(?<!')-|-(?!')");
for (int i = 0; i < split.length; i++)
    split[i] = split[i].replaceAll("'-'", "-");

输出

[key, keyone, keytwo]
[key, key, 'one, keytwo]
[key, key', one, keytwo]
[key, key-one, keytwo]

您可以使用Streams在单个语句中做到这一点:

String[] split = Pattern.compile("(?<!')-|-(?!')")
        .splitAsStream(str)
        .map(s -> s.replaceAll("'-'", "-"))
        .toArray(String[]::new);

当然也可以写成一行:

String[] split = Pattern.compile("(?<!')-|-(?!')").splitAsStream(str).map(s -> s.replaceAll("'-'", "-")).toArray(String[]::new);

答案 1 :(得分:0)

请参阅与python有关的答案,Java应该具有类似的功能-Python split string without splitting escaped character

>>> re.split(r'(?<!\')-', "key-key'-'one-keytwo")
  ['key', "key'-'one", 'keytwo']

但是'-'不是逃脱分隔符的理想方法,可以使用反斜杠