Regex: пропустить первое появление шаблона - PullRequest
3 голосов
/ 11 августа 2011

Допустим, у меня есть строка foo со значениями, разделенными пробелами:

  • [value 1] [value 2] [value 3] ... [value n]

Каким будет регулярное выражение split (...) foo, чтобы результирующий массив String содержал все значения, кроме value 1?Это вообще возможно?

Вот что у меня пока есть:

  • String[] array = foo.split("\\s");

И это не так много, я знаю.


РЕДАКТИРОВАТЬ:

Я хочу сделать это чисто с помощью регулярных выражений .Если это невозможно, пожалуйста, дайте мне знать!

Ответы [ 4 ]

3 голосов
/ 11 августа 2011

Как только вы разбили свою строку на массив значений, переберите массив и сделайте все, что вам нужно, пропустив первую итерацию.

for(i=1; i<array.count(); i++){
    //Act on the data value
}
2 голосов
/ 11 августа 2011

Ваш разделитель может быть"либо последовательностью пробелов, либо кусками не-w в начале строки, но это оставляет пустую строку в начале:

Arrays.toString("abc def  ghi   jkl".split("\\s+|^\\S+\\s+"))

производит

[,def,ghi]

Это проблема с split - я думаю, вы всегда получите что-то в начале вашего массива. К сожалению, я думаю, вам нужно ударитьот начала строки до разделения, или используйте Java Arrays.copyOfRange() или аналогичный для постобработки.

Удаление начала можно сделать с помощью replaceFirst:

import java.util.Arrays;
public class SplitExample {

    public static final String data = "abc   def  ghi";
    public static void main(String[] args) {
        System.out.println(Arrays.toString(data.split("\\s+")));
        System.out.println(Arrays.toString(data.split("\\s+|^\\S+\\s+")));
        System.out.println(Arrays.toString(data.replaceFirst("^\\S+\\s+", "").split("\\s+")));
    }
}

Окончательный вариантСтрока настолько близка, насколько я могу получить, потому что split производит совпадения ВОКРУГ ваших разделителей. Как вы можете избежать пустой строки спереди одним разделением? Я не уверен, что есть способ ....

0 голосов
/ 11 августа 2011

Поскольку консенсус кажется невозможным, я предлагаю следующее решение:

При условии, что у вас есть только ОДИН пробел в значении 'мусор',

int ix = theString.indexOf(" ");
ix = theString.indexOf(" ", ix);
theString.substring(ix + 1).split("\\s");

Получает подстроку из второго пробела в строке (первый пробел после пробела в значении «мусор»), а затем разбивает ее.

0 голосов
/ 11 августа 2011

Сможете ли вы сделать это?

String[] array = foo.split("\\S*\\s")[1].split("\\s");

Это 2 разбиения регулярных выражений вместо одного, но это лучше, чем зацикливание позже.Я не уверен, что это правильно, но сначала следует разделить строку на «любое количество непробельных символов с последующим пробелом» и все остальное.Затем вы можете разбить все остальное только на пробелы, и у вас останется массив, исключающий первый элемент.

Редактировать: Да, это невозможно сделать с помощью одного разбиенияпоскольку единственный способ иметь что-то кроме "" в качестве первого элемента в вашем массиве - это иметь что-то, что вы не удаляете с помощью разбиения в начале строки.

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