Расщепление строк - PullRequest
       4

Расщепление строк

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

У меня есть строка, как лучше всего поместить вещи между $ в списке в java?

String temp = $abc$and$xyz$;

как я могу получить все переменные в $ sign в виде списка в java[abc, xyz]

Я могу использовать stringtokenizer, но хочу по возможности избегать его использования.ТНХ

Ответы [ 8 ]

9 голосов
/ 30 августа 2010

Возможно, вы могли бы подумать о том, чтобы позвонить String.split(String regex) ...

4 голосов
/ 30 августа 2010

Шаблон достаточно прост, чтобы String.split работал здесь, но в более общем случае одна альтернатива для StringTokenizer гораздо более мощная java.util.Scanner.

    String text = "$abc$and$xyz$";
    Scanner sc = new Scanner(text);

    while (sc.findInLine("\\$([^$]*)\\$") != null) {
        System.out.println(sc.match().group(1));
    } // abc, xyz

Шаблон для поиска:

\$([^$]*)\$
  \_____/     i.e. literal $, a sequence of anything but $ (captured in group 1)
     1                 and another literal $

[…] - это класс символов .Нечто вроде [aeiou] соответствует одному из строчных гласных.[^…] - это отрицательный класс символов.[^aeiou] соответствует одному из всего, кроме строчных гласных.

(…) используется для группировки .(pattern) является группой захвата и создает обратную ссылку.

Обратная косая черта, предшествующая $ (вне определения класса символов), используется для экранирования $, который имеет особое значение как конец строки привязки .Обратная косая черта удваивается в литерале String: "\\" имеет длину String длины, содержащую обратную косую черту).

Это не типичное использование Scanner (обычно устанавливается шаблон разделителя)и токены извлекаются с использованием next), но он показывает, как вы использовали findInLine для поиска произвольного шаблона (игнорируя разделители), а затем с помощью match() для доступа к MatchResult, из которого вы можете получить отдельные групповые снимки .

Вы также можете использовать это Pattern в Matcher find() цикл напрямую.

    Matcher m = Pattern.compile("\\$([^$]*)\\$").matcher(text);
    while (m.find()) {
        System.out.println(m.group(1));
    } // abc, xyz

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

1 голос
/ 30 августа 2010

По сути, я бы сказал, что Хотин - самое простое решение. Я вижу, как вы отвечаете на его ответ, что вам не нужны токены нулевой длины в начале и в конце.

Это поднимает вопрос: что произойдет, если строка не начинается и не заканчивается на $? Это ошибка или они необязательны?

Если это ошибка, тогда просто начните с:

if (!text.startsWith("$") || !text.endsWith("$"))
  return "Missing $'s"; // or whatever you do on error

Если это пройдет, попадите в раскол.

Если $ не обязательны, я бы просто удалил их перед разбиением. i.e.:

if (text.startsWith("$"))
  text=text.substring(1);
if (text.endsWith("$"))
  text=text.substring(0,text.length()-1);

Тогда сделайте разделение.

Конечно, вы можете сделать более сложные регулярные выражения или использовать StringTokenizer, или, без сомнения, придумать десятки других сложных решений. Но зачем? Если есть простое решение, используйте его.

PS Есть также вопрос о том, какой результат вы хотите увидеть, если в строке два $, например "$ Foo $$ бар $". Должно ли это дать ["foo", "bar"] или ["foo", "", "bar"]? Расщепление Хотина даст второй результат, со строками нулевой длины. Если вы хотите получить первый результат, вы должны разделить ("\ $ +").

1 голос
/ 30 августа 2010

Я бы сам пошел на регулярное выражение, как сказал Ридюйдель.

Однако этот особый случай достаточно прост, так что вы можете просто рассматривать String как последовательность символов, итерировать по ней символ за символом и обнаруживать знак $. И так возьми струны сами.

На боковом узле я бы попытался использовать разные символы разметки, чтобы сделать его более читабельным для людей . Используйте $ как начало последовательности и что-то еще как конец последовательности, например. Или что-то вроде того, я думаю, что оболочка Bash использует: ${some_value}. Как уже было сказано, компьютеру все равно, но вы можете отладить вашу строку:)

Что касается соответствующего регулярного выражения, то должно подойти что-то вроде (\\$.*\\$)* или около того. Хотя я не эксперт по регулярным выражениям (см. http://www.regular -expressions.info для получения хорошей информации о регулярных выражениях).

1 голос
/ 30 августа 2010

Просто попробуйте это: temp.split("\\$");

0 голосов
/ 05 мая 2015

Вы можете использовать

String temp = $abc$and$xyz$;
String array[]=temp.split(Pattern.quote("$"));
List<String> list=new ArrayList<String>();
for(int i=0;i<array.length;i++){
list.add(array[i]);
}

Теперь в списке есть то, что вы хотите.

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

Вы можете сделать это простым способом, написав свой собственный код. Просто используйте следующий код, и он сделает всю работу за вас

import java.util.ArrayList; import java.util.List;

открытый класс MyStringTokenizer {

/**
 * @param args
 */
public static void main(String[] args) {

    List <String> result = getTokenizedStringsList("$abc$efg$hij$");

    for(String token : result)
    {
        System.out.println(token);
    }

}

private static List<String> getTokenizedStringsList(String string) {

    List <String> tokenList = new ArrayList <String> ();

    char [] in = string.toCharArray();

    StringBuilder myBuilder = null;
    int stringLength = in.length;
    int start = -1;
    int end = -1;
    {
        for(int i=0; i<stringLength;)
        {
            myBuilder = new StringBuilder();
            while(i<stringLength && in[i] != '$')
                i++;
            i++;
            while((i)<stringLength && in[i] != '$')
            {

                myBuilder.append(in[i]);
                i++;
            }
            tokenList.add(myBuilder.toString());                
        }
    }
    return tokenList;
}

}

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

Если вы хотите простую функцию разделения, используйте Apache Commons Lang с StringUtils.split. Java использует регулярное выражение, которое может быть излишним / запутанным.

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