Сплит / токенизация / сканирование строки, зная кавычки - PullRequest
3 голосов
/ 01 июля 2010

Существует ли в Java способ по умолчанию / простой способ разделения строк, но с учетом кавычек или других символов?

Например, с учетом этого текста:

There's "a man" that live next door 'in my neighborhood', "and he gets me down..."

Получить

There's
a man
that
live
next
door
in my neighborhood
and he gets me down

Ответы [ 2 ]

5 голосов
/ 01 июля 2010

Что-то вроде этого работает для вашего ввода:

    String text = "There's \"a man\" that live next door "
        + "'in my neighborhood', \"and he gets me down...\"";

    Scanner sc = new Scanner(text);
    Pattern pattern = Pattern.compile(
        "\"[^\"]*\"" +
        "|'[^']*'" +
        "|[A-Za-z']+"
    );
    String token;
    while ((token = sc.findInLine(pattern)) != null) {
        System.out.println("[" + token + "]");
    }

Приведенные выше отпечатки ( как видно на ideone.com ):

[There's]
["a man"]
[that]
[live]
[next]
[door]
['in my neighborhood']
["and he gets me down..."]

Используется Scanner.findInLine, где шаблон регулярного выражения является одним из:

"[^"]*"      # double quoted token
'[^']*'      # single quoted token
[A-Za-z']+   # everything else

Без сомнения, это не всегда работает на 100%;случаи, когда кавычки могут быть вложенными и т. д., будут хитрыми.

Ссылки

1 голос
/ 01 июля 2010

Сомнительно, исходя из вашей логики, у вас есть различие между апострофом и одинарными кавычками, то есть There's и in my neighborhood

Вам бы пришлось разработать какую-то логику сопряжения, если бы вы хотели то, что у вас есть выше. Я думаю о регулярных выражениях. Или какой-то разбор из двух частей.

...