Вы хотите разделить на -
, но не на '-'
, но в то же время хотите заменить '-'
на -
. Вы не можете сделать это с помощью всего лишь вызова split()
, поскольку он не выполняет замену.
Вы можете выполнить разделение, разделив на -
, которому не предшествует или , за которым следует '
:
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);