我有一个用连字符分隔的字符串键列表,如下所示:
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]
,我知道它有点复杂,但是任何建议都会帮助!
答案 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']
但是'-'不是逃脱分隔符的理想方法,可以使用反斜杠