Java String.split () Regex - PullRequest
       12

Java String.split () Regex

14 голосов
/ 25 марта 2012

У меня есть строка:

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]

Есть ли что-то, что я могу сделать, чтобы множественные символьные операторы появлялись в массиве так, как я хочу?

И в качестве второстепенного вопроса, который не так важен, есть ли в регулярном выражении способ обрезать пропуски вокруг букв?

Ответы [ 6 ]

36 голосов
/ 25 марта 2012
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.

16 голосов
/ 25 марта 2012
str.split (" ") 
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)
4 голосов
/ 04 января 2014
    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);
        }
    }

Вывод: + - * / <>> = <= == </p>

1 голос
/ 25 марта 2012

Вы можете разбить границу слова с помощью \ b

0 голосов
/ 11 апреля 2014

Вы также можете сделать что-то вроде:

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]
0 голосов
/ 25 марта 2012

Можете ли вы инвертировать свое регулярное выражение, разделенное на неоперационные символы?

String ops[] = string.split("[a-z]")
// ops == [+, -, *, /, <, >, >=, <=, == ]   

Это, очевидно, не возвращает переменные в массиве.Возможно, вы можете чередовать два разбиения (одно по операторам, одно по переменным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...