Проблема разделения строки с разделением (регулярное выражение) Java - PullRequest
2 голосов
/ 26 февраля 2012

Я хочу разбить несколько строк, похожих на name: john, id: 20, dest: toledo, from: seattle, date_time: [2/8/12 15:48:01:837 MST], только на следующие токены:

john
20
toledo
seattle
[2/8/12 15:48:01:837 MST]

Я делаю это

String delims = "(name|id|dest|from|date_time)?[:,\\s]+";
String line = "name: john, id: 20, dest: toledo, from: seattle, date_time: [2/8/12 15:48:01:837 MST]";
String[] lineTokens = line.split(delims, 5);

for (String t : lineTokens)
{
    // for debugging
    System.out.println (t);
    // other processing I want to do
}   

, но каждый четный элемент в lineTokensоказывается либо пустым, либо просто пробелом.Каждый нечетный элемент в lineTokens - это то, что я хочу, т.е. lineTokens [0] - это "", lineTokens [1] - это "Джон", lineTokens [2] - это "", lineTokens [3] - это "20" и т. Д.что я делаю не так?

Ответы [ 3 ]

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

Проблема в том, что ваше регулярное выражение не соответствует , id: в целом, оно соответствует , как одному, а затем id: как 2-му совпадению.Между этими двумя матчами у вас есть пустая строка.Вы должны изменить это, чтобы соответствовать целому.Примерно так:

String delims = "(, )?(name|id|dest|from|date_time)?[:\\s]+";

http://ideone.com/Qgs8y

2 голосов
/ 26 февраля 2012

Почему бы не немного менее сложное решение регулярных выражений.

String str =  "name: john, id: 20, dest: toledo, from: seattle, date_time: [2/8/12 15:48:01:837 MST]";
String[] expr = str.split(", ");
for(String e : expr)
System.out.println(e.split(": ")[1]);

Выход =

Джон

20

Толедо

Сиэтл

[2/8/12 15: 48: 01: 837 MST]

1 голос
/ 26 февраля 2012

Я внес некоторые изменения в ваш код:

    String delims = "(name|id|dest|from|date_time)[:,\\s]+";
    String line = "name: john, id: 20, dest: toledo, from: seattle, date_time: [2/8/12 15:48:01:837 MST]";
    String[] lineTokens = line.split(delims);

    for (String t : lineTokens)
    {
        // for debugging
        System.out.println (t);
        // other processing I want to do
    }   

также вы должны игнорировать первый элемент в lineTokens, так как он захватывает от начала строки до "name: ...."

...