Разделение строки с помощью разделителей слов

у меня есть строка, как показано ниже

a > b and c < d or d > e and f > g

результат должен быть:

a > b
and
c < d
or
d > e
and
f > g

я хочу разделить строку на вхождения "и", "или" и получить разделители вместе с токеном. [мне они нужны для оценки выражения]

я пытался использовать StringTokenizer как

 new StringTokenizer(x, "\\sand\\s|\\sor\\s", true);

но я не получаю желаемого результата. я пытался использовать сканер как

 Scanner sc = new Scanner(x);
        sc.useDelimiter("and | or");

это может разделить, но не возвращает разделители.

пожалуйста, предложите.

я дал a, b, c выше, но там могут быть слова вместо a, b, c с пробелами. Обновленный пример.


person jch    schedule 08.06.2011    source источник
comment
Ваше описание подразумевает использование строк и & или в качестве разделителей, но ваш вывод подразумевает использование разделителя. Просьба уточнить.   -  person djg    schedule 09.06.2011
comment
дох! я даю плохой пример в виде строки.. позвольте мне привести еще один пример   -  person jch    schedule 09.06.2011
comment
stackoverflow.com/questions/3777546/   -  person JustinKSU    schedule 09.06.2011


Ответы (5)


Это будет разделено на «и» или «или» с любым количеством пробелов вокруг слов.

   String test = "2 < 3 and 3 > 2 or 4 < 6 and 7 < 8";

    String [] splitString = test.split("\\s*[and|or]+\\s*");
    for(int i = 0; i < splitString.length ; i ++){
        System.out.println(splitString[i]);
    }

выход

2 < 3
3 > 2
4 < 6
7 < 8
person jeffb    schedule 08.06.2011
comment
как получить разделитель? - person jch; 09.06.2011

Что вам действительно нужно, так это инструмент, подобный JFlex, к тому времени, когда вы столкнетесь со всеми различными перестановками пробелов и в качестве вашего синтаксиса. растет. В долгосрочной перспективе вы сэкономите время.

person Romain Hippeau    schedule 08.06.2011

Насколько мне известно, StringTokenizer — это единственный стандартный класс Java, способный возвращать используемый разделитель. Просто скопировал регулярное выражение из OT, предполагая, что оно будет делать то, что он хочет (в чем, на второй взгляд, я крайне сомневаюсь из его текстового описания, ну да ладно - просто вставьте правильное)

    String input = "a > b and c < d or d > e and f > g";
    StringTokenizer tokenizer = new StringTokenizer(input, "\\sand\\s|\\sor\\s", true);
    while (tokenizer.hasMoreTokens()) {
        System.out.println(tokenizer.nextToken());
    }
person Voo    schedule 09.06.2011

String str = "2 < 3 and 3 > 2 or 4 < 6 and 7 < 8";
System.out.println( ImmutableList.copyOf( str.split( "(?=and|or)" ) ) );

Выход:

[2 < 3 , and 3 > 2 , or 4 < 6 , and 7 < 8]
person takacsot    schedule 06.09.2019

person    schedule
comment
OP хочет, чтобы разделители также были возвращены. split не будет возвращать разделители. - person CoolBeans; 09.06.2011