Проблемы с разделением текста

Вот код, который я использую:

public class splitText {
public static void main(String[] args) {
    String x = "I lost my Phone. I shouldn't drive home alone";
    String[] result = x.split(".");
    for (String i : result) {
        System.out.println(i);
    }
}
}

Компилируется отлично, но во время выполнения ничего не происходит. Что я делаю неправильно?


person MoonStruckHorrors    schedule 16.07.2010    source источник
comment
Компилируется отлично, но во время выполнения ничего не происходит. - Это может разбить вам сердце, но то, что он компилируется, не означает, что он работает.   -  person polygenelubricants    schedule 16.07.2010
comment
Ой нет ... пожалуйста, скажи мне, что ты шутишь. :П   -  person MoonStruckHorrors    schedule 16.07.2010
comment
компьютер (почти) всегда делает именно то, что вы сказали ему сделать ... не обязательно то, что вы хотите, чтобы он сделал ...   -  person user85421    schedule 05.11.2010


Ответы (4)


_ 1_ принимает шаблон регулярного выражения. Так уж получилось, что . в регулярном выражении - это метасимвол, который соответствует (почти) любому символу, поэтому split(".") работает не так, как вы ожидали.

Вы можете избежать ., поставив перед ним обратную косую черту. В качестве строкового литерала Java это "\\.". \ удваивается, потому что \ сам по себе является escape-символом Java. "\\." - это String длины 2, содержащий обратную косую черту и точку.

Если вам дается произвольный String, который должен быть сопоставлен буквально (или если вы просто не хотите избегать его самостоятельно), вы можете использовать _ 11_. Он создаст шаблон, буквально соответствующий заданному String.

Смотрите также


Это предоставляется только в образовательных целях:

    String text =
        "Wait a minute... what?!? Oh yeah! This is awesome!!";

    for (String part : text.split("(?<=[.?!]) ")) {
        System.out.println(part);
    }

Это печатает:

Wait a minute...
what?!?
Oh yeah!
This is awesome!!

использованная литература

Связанные вопросы

person polygenelubricants    schedule 16.07.2010
comment
\\. представляет собой строку длиной 2, содержащую обратную косую черту и точку. Ммм .. Я этого не поняла. Может ли кто-нибудь еще раз объяснить это? - person MoonStruckHorrors; 16.07.2010
comment
@MoonStruckHorrors: String s = "\n"; содержит один символ, символ новой строки. "\t" содержит вкладку. "\\" содержит обратную косую черту. "\"" содержит двойные кавычки. Это называется escape-последовательностью. Итак, поскольку "\\" содержит обратную косую черту, "\\." содержит обратную косую черту и точку. Вы можете распечатать его и проверить length() для подтверждения. См. Также stackoverflow.com/questions/3224337/doubt-about-java -char - person polygenelubricants; 16.07.2010
comment
Спасибо. Но разве это не значит, что он разделит строку на \., а не на .? - person MoonStruckHorrors; 16.07.2010
comment
@MoonStruck: шаблон регулярного выражения \. соответствует буквальной точке. Шаблон регулярного выражения . соответствует (почти) любому символу. Таким образом, шаблон a.b соответствует таким строкам, как "axb", "a!b" и т. Д. Шаблон a\.b соответствует только "a.b". - person polygenelubricants; 16.07.2010

String.split использует регулярное выражение, поэтому точка (.) Означает «что угодно». Вам нужно избежать точки

public static void main(String[] args) {
    String x = "I lost my Phone. I shouldn't drive home alone";
    String[] result = x.split("\\.");
    for (String i : result) {
        System.out.println(i.trim());
    }
}

дает:

I lost my Phone
I shouldn't drive home alone
person Jean-Philippe Caruana    schedule 16.07.2010

Пытаться

String [] result = x.split("\\.");

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

person Pace    schedule 16.07.2010

Если вы не хотите использовать регулярное выражение, вы можете использовать разделитель guava lib.

http://guava-libraries.googlecode.com/svn/trunk/javadoc/index.html

 String x = "I lost my Phone. I shouldn't drive home alone";
 Splitter.on('.').trimResults().split(x)

кроме того, результатом является Iterable, а не массив

person sly7_7    schedule 16.07.2010