Разделить строку особым образом - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть эта строка: "player.login name=username;x=52;y=406" как бы я мог разделить ее, чтобы я мог легко сделать Player pl = new Player(name, x, y)?

Я пытался с регулярным выражением, которое выглядит так: "([a-zA-Z_]+)[=]{1}([a-zA-Z0-9_]+)[;]{1}", но я не очень хорош в регулярных выражениях, поэтому оно не сработало.

РЕДАКТИРОВАТЬ: Кто-то придумал хорошее решение, поэтому не нужно комментировать. :)

Что я использовал:

public static void main(String args[]) {
    String login = "player.login name=username;x=52;y=406";
    String str = login.substring("player.login".length() + 1);
    String[] sp = str.split(";");
    Player player = new Player("", 0, 0);
    for (String s : sp) {
        String[] a = s.split("=");
        if (a[0].equals("name")) player.username = a[1];
        else if (a[0].equals("x")) player.x = toInt(a[1]);
        else if (a[0].equals("y")) player.y = toInt(a[1]);
    }
    System.out.println("Player: " + player.username + " @ " + player.x + ", " + player.y);
}

public static int toInt(String s) {
    return Integer.parseInt(s);
}

Ответы [ 5 ]

3 голосов
/ 22 февраля 2012

Это должно работать (вы должны добавить связанные проверки перед вызовом exp.split("=")[1]):

public static void main(String[] args) {
    String s = "player.login name=username;x=52;y=406";
    String[] expressions = s.split(";");
    for (String exp : expressions) {
        System.out.println(exp.split("=")[1]);
    }
}
2 голосов
/ 22 февраля 2012

Поскольку в Java 7 есть поддержка именованных групп захвата, было бы неплохо использовать здесь

String s = "player.login name=username;x=52;y=406";

Pattern p = Pattern.compile("name=(?<UserName>[^;]+);" +  // Match the UserName in the Named Group "UserName", matching at least one non semicolon
    "x=(?<x>\\d+);" + // Match the value of x in the Named Group "x", matching at least one digit
    "y=(?<y>\\d+)"    // Match the value of y in the Named Group "y", matching at least one digit
    );
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group("UserName"));
    System.out.println(m.group("x"));
    System.out.println(m.group("y"));
}
1 голос
/ 22 февраля 2012

Или вы можете попробовать с гуавой:

String data = "player.login name=username;x=52;y=406";
List<String> fields = ImmutableList.copyOf(Splitter.on(' ').limit(2).split(data));

String type = fields.get(0);
Map<String, String> properties = Splitter.on(';').trimResults().withKeyValueSeparator("=").split(fields.get(1));
1 голос
/ 22 февраля 2012

Вы можете использовать String.split() три раза, разделив пробел, затем точку с запятой, затем =. Или ответ assylia делает это с двумя разделениями - лучшее решение скорее зависит от того, хотите ли вы проверить части текста, который вы отбрасываете.

Или с помощью регулярных выражений ...

String regex = ".+=(\\w+);x=(\\d+);y=(\\d+)"

... которую вы можете запустить с помощью следующего кода:

    Pattern p = Pattern.compile(".+=(\\w+);x=(\\d+);y=(\\d+)");
    Matcher m = p.matcher("player.login name=username;x=52;y=406");
    m.find();
    System.out.println(m.group(1) + "," + m.group(2) + "," + m.group(3));
0 голосов
/ 22 февраля 2012

Попробуйте использовать шаблон вместо:

public static void main(String args[]){
    String str = "player.login name=username;x=52;y=406";

    Pattern p = Pattern.compile("^player\\.login name=(.+);x=(\\d+);y=(\\d+)$");

    Matcher m = p.matcher(str);

    Player player;
    if (m.matches()){
        String name = m.group(1);
        int x = Integer.parseInt(m.group(2));
        int y = Integer.parseInt(m.group(3));

        System.out.println(name);
        System.out.println(x);
        System.out.println(y);

        player = new Player(name, x, y);
    } else {
        player = null;
    }

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