【问题标题】:Trouble splitting string with split(regex) Java使用 split(regex) Java 拆分字符串时遇到问题
【发布时间】:2012-02-26 02:19:32
【问题描述】:

我想将一些类似于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] 是“john”,lineTokens[2] 是“”,lineTokens[3] 是“20”,等等。谁能解释我做错了什么?

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    问题是您的正则表达式不匹配, id: 作为一个整体,它匹配, 作为一个匹配,然后匹配id: 作为第二个匹配。在这两个匹配项之间,您有一个空字符串。你需要修改它以匹配整个事情。像这样的:

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

    http://ideone.com/Qgs8y

    【讨论】:

    • 这行得通。我很好奇为什么 lineTokens 的第 0 个索引仍然是空的,为什么你将 6 传递给 split() 的第二个参数(似乎只是因为第 0 个索引是空的)。
    • 哦,这两个问题的答案其实是一样的。如果您的字符串以分隔符开头,您将获得一个空字符串作为您的第一个匹配项。需要忽略该匹配项。
    【解决方案2】:

    为什么不简单一点的正则表达式解决方案。

    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]

    【讨论】:

    • 技术上 ", "": " 仍然是正则表达式。
    • @isbadawi:不错,但你知道我的意思。
    【解决方案3】:

    我对您的代码做了一些更改:

        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:....”的捕获

    【讨论】:

    • 你测试过这个吗?我认为您的代码输出将是 lineTokens[1] == "john, " 而不是 lineTokens[1] == "john"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多