В качестве альтернативы можно использовать комбинацию lookahead и lookbehind для сопоставления нулевой ширины.
String equation = "1.5+4.2*(5+2)";
String regex = "(?<=op)|(?=op)".replace("op", "[-+*/()]");
// actual regex becomes (?<=[-+*/()])|(?=[-+*/()])
System.out.println(java.util.Arrays.toString(
equation.split(regex)
));
// ___ _ ___ _ _ _ _ _ _
// [1.5, +, 4.2, *, (, 5, +, 2, )]
Объяснение
[…]
- определение класса символов (?<=…)
- взгляд назад;он утверждает, что мы можем сопоставить …
слева (?=…)
- это взгляд в будущее;он утверждает, что мы можем сопоставить …
вправо this|that
является чередованием - Таким образом,
(?<=op)|(?=op)
совпадает везде после или до op
- ..где
op
заменено на [-+*/()]
, т. е. класс символов, соответствующий операторам - Обратите внимание, что
-
здесь первый, поэтому он не становится метасимволом определения диапазона
Ссылки
Смежные вопросы
Дополнительные примеры регулярных выражений с нулевой шириной для разделения
Вот еще несколько примеров разбиения на конструкции соответствия нулевой ширины;это может быть использовано для разделения строки, но также для сохранения разделителей.
Простое разделение предложений с сохранением знаков препинания:
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]"
Разделить перед заглавными буквами (кроме первой!)
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
)); // prints "[Oh, My, God]"
В соответствующих вопросах ниже приведены различные примеры.
Связанные вопросы