проблема с разделением Java () - PullRequest
3 голосов
/ 05 августа 2010

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

strArray= "-------9---------------";

Я хочу найти 9 из строки.Строка может быть такой:

strArray= "---4-5-5-7-9---------------";

Теперь я хочу узнать только цифры из строки.Мне нужны значения 9,4, или такие вещи, и игнорировать «-».Я попробовал следующее:

strArray= strignId.split("-");

, но он получает ошибку, так как есть несколько символов "-", и я не получаю вывод.Так какую функцию Java следует использовать?

Мой ввод и вывод должны быть следующими:

input="-------9---------------";
    output="9";
input="---4-5-5-7-9---------------";
    output="45579";

Что мне делать?

Ответы [ 3 ]

19 голосов
/ 05 августа 2010

+ является метасимволом регулярных выражений повторения «один или более», поэтому шаблон -+ является «одним или несколькими тире».Это позволит вам использовать str.split("-+") вместо этого, но вы можете получить пустую строку в качестве первого элемента.

Если вы просто хотите удалить все -, тогда вы можете сделать str = str.replace("-", "").При этом используется метод replace(CharSequence, CharSequence), который выполняет буквальную замену String, т. Е. Не шаблоны регулярных выражений.

Если вы хотите String[] с каждой цифрой в своем собственном элементе, тогда это проще всего.сделать в два шага: сначала удалить все нецифровые символы, затем использовать утверждение нулевой длины, чтобы разделить все, что не является началом строки (?!^) (чтобы предотвратить получение пустой строки в качестве первого элемента).Если вы хотите char[], то вы можете просто позвонить String.toCharArray()

Наконец, если строка может быть очень длинной, лучше использовать java.util.regex.Matcher в цикле find() для поиска цифры \d или java.util.Scanner с разделителем \D*, т. Е. Последовательность (возможно, пустая) нецифровых чисел.Это не даст вам массив, но вы можете использовать цикл для заполнения List (см. Effective Java 2nd Edition, пункт 25. Предпочитайте списки массивам ).

Ссылки


Snippets

Вот несколько примеров, иллюстрирующих вышеприведенные идеи:

    System.out.println(java.util.Arrays.toString(
        "---4--5-67--8-9---".split("-+")
    ));
    // [, 4, 5, 67, 8, 9]
    // note the empty string as first element

    System.out.println(
        "---4--5-67--8-9---".replace("-", "")
    );
    // 456789

    System.out.println(java.util.Arrays.toString(
        "abcdefg".toCharArray()
    ));
    // [a, b, c, d, e, f, g]

В следующем примере сначала удаляются все не-цифры \D, затемрасщепление везде, кроме начала строки (?!^), чтобы получить String[], каждый из которых содержит цифру:

    System.out.println(java.util.Arrays.toString(
        "@*#^$4@!#5ajs67>?<{8_(9SKJDH"
            .replaceAll("\\D", "")
            .split("(?!^)")
    ));
    // [4, 5, 6, 7, 8, 9]

Для получения каждой цифры используется Scanner, с \D* в качестве разделителя.в качестве собственного токена, используя его для заполнения List<String>:

    List<String> digits = new ArrayList<String>();
    String text = "(&*!@#123ask45{P:L6";
    Scanner sc = new Scanner(text).useDelimiter("\\D*");
    while (sc.hasNext()) {
        digits.add(sc.next());
    }
    System.out.println(digits);
    // [1, 2, 3, 4, 5, 6]

Типичные проблемы с split()

Вот некоторые распространенные проблемы новичков при работе с String.split:

Занятие № 1: split использует шаблон регулярного выражения

Это, вероятно, самая распространенная ошибка для начинающихпринять:

System.out.println(java.util.Arrays.toString(
    "one|two|three".split("|")
));
// [, o, n, e, |, t, w, o, |, t, h, r, e, e]

System.out.println(java.util.Arrays.toString(
    "not.like.this".split(".")
));
// []

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

System.out.println(java.util.Arrays.toString(
    "one|two|three".split("\\|")
));
// [one, two, three]

System.out.println(java.util.Arrays.toString(
    "not.like.this".split("\\.")
));
// [not, like, this]

Занятие № 2: split по умолчанию отбрасывает конечные пустые строки

Иногда желательно сохранить конечные пустые строки (которые отбрасываютсяпо умолчанию split):

    System.out.println(java.util.Arrays.toString(
        "a;b;;d;;;g;;".split(";")
    ));
    // [a, b, , d, , , g]

Обратите внимание, что есть места для «пропущенных» значений для c, e, f, но не для h и i.Чтобы исправить это, вы можете использовать отрицательный аргумент limit для String.split(String regex, int limit).

    System.out.println(java.util.Arrays.toString(
        "a;b;;d;;;g;;".split(";", -1)
    ));
    // [a, b, , d, , , g, , ]

Вы также можете использовать положительный limit из n применять шаблон не более n - 1 раз (т. е. в результате получается не более n элементов в массиве).


Соответствие нулевой ширины split examples

Вот еще несколько примеров разбиения на конструкции соответствия нулевой ширины;это может использоваться для разделения строки, но также для сохранения «разделителей».

Простое разделение предложений с сохранением знаков пунктуации:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

Разделение длинной строки на части фиксированной длины с использованием \G

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

Разделить перед заглавными буквами (кроме первой!)

    System.out.println(java.util.Arrays.toString(
        "OhMyGod".split("(?=(?!^)[A-Z])")
    )); // prints "[Oh, My, God]"

В соответствующих вопросах ниже приведены различные примеры.

Ссылки

Смежные вопросы

5 голосов
/ 05 августа 2010

Вы не используете разделение!

Разделение - это получение вещей между разделителем.

Для этого вы хотите исключить ненужные символы;'-'

Решение простое

out = in.replaceAll ("-", "");

0 голосов
/ 05 августа 2010

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


final Vector nodes = new Vector();
int index = original.indexOf(separator);
while (index >= 0) {
  nodes.addElement(original.substring(0, index));
  original = original.substring(index + separator.length());
  index = original.indexOf(separator);
}
nodes.addElement(original);
final String[] result = new String[nodes.size()];
if (nodes.size() > 0) {
  for (int loop = 0; loop smaller nodes.size(); loop++) {
    result[loop] = (String) nodes.elementAt(loop);
  }
}
return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...