Java String.split() Regex
У меня есть строка:
String str = "a + b - c * d / e < f > g >= h <= i == j";
Я хочу разбить строку на всех операторах, но включать операторы в массив, поэтому результирующий массив выглядит так:
[a , +, b , -, c , *, d , /, e , <, f , >, g , >=, h , <=, i , ==, j]
У меня есть это сейчас:
public static void main(String[] args) {
String str = "a + b - c * d / e < f > g >= h <= i == j";
String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=]))";
String[] res = str.split(reg);
System.out.println(Arrays.toString(res));
}
Это довольно близко, это дает:
[a , +, b , -, c , *, d , /, e , <, f , >, g , >, =, h , <, =, i , =, =, j]
Есть ли что-то, что я могу сделать для этого, чтобы заставить многосимвольные операторы появляться в массиве, как я хочу?
И как второстепенный вопрос, который не так важен, есть ли способ в регулярном выражении обрезать пробел вокруг букв?
Ответы
Ответ 1
String[] ops = str.split("\\s*[a-zA-Z]+\\s*");
String[] notops = str.split("\\s*[^a-zA-Z]+\\s*");
String[] res = new String[ops.length+notops.length-1];
for(int i=0; i<res.length; i++) res[i] = i%2==0 ? notops[i/2] : ops[i/2+1];
Это должно сделать это. Все красиво хранится в res
.
Ответ 2
str.split (" ")
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)
Ответ 3
String str = "a + b - c * d / e < f > g >= h <= i == j";
String reg = "\\s*[a-zA-Z]+";
String[] res = str.split(reg);
for (String out : res) {
if (!"".equals(out)) {
System.out.print(out);
}
}
Выход: + - */< → = <= ==
Ответ 4
Вы можете разбить границу слова с помощью\b
Ответ 5
Можете ли вы изменить свое регулярное выражение так, чтобы его разделили неработающие символы?
String ops[] = string.split("[a-z]")
// ops == [+, -, *, /, <, >, >=, <=, == ]
Это, очевидно, не возвращает переменные в массиве. Возможно, вы можете чередовать два расщепления (один по операторам, один по переменным)
Ответ 6
Вы также можете сделать что-то вроде:
String str = "a + b - c * d / e < f > g >= h <= i == j";
String[] arr = str.split("(?<=\\G(\\w+(?!\\w+)|==|<=|>=|\\+|/|\\*|-|(<|>)(?!=)))\\s*");
Он обрабатывает пробелы и слова переменной длины и создает массив:
[a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j]