有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正则表达式在Java中使用特定模式拆分字符串

我正在为包含以下字符串模式的文件编写解析器:

Key : value
Key : value
Key : value
etc...

我能够将这些行一行一行地检索到列表中。我想做的是将这些字符串中的每一个的键与值分开。我知道有split()方法可以接受正则表达式并为我执行此操作,但我对它们非常陌生,因此我不知道将哪个正则表达式作为split()函数的参数

此外,虽然不在我正在解析的文件规范中,但我希望该正则表达式也能够识别以下模式(如果可能):

Key: value
Key :value
Key:value
etc...

所以基本上,不管在:字符之后/之前/之后和之前是否有空格,我希望正则表达式能够检测到它。什么是可以实现这一点的正则表达式


共 (5) 个答案

  1. # 1 楼答案

    换句话说split方法应该查找:和它之前或之后的零个或多个空格

    Key: value
       ^^
    Key :value
       ^^
    Key:value
       ^
    Key : value
       ^^^
    

    在这种情况下split("\\s*:\\s*")应该可以做到这一点

    说明:

    • \\s表示任何空格
    • *表示前面描述的元素的一次或多次出现
    • \\s*表示零个或多个空格

    另一方面,您可能还希望找到整个key:value对,并将匹配keyvalue的部分放在单独的组中(您甚至可以使用(?<groupName>regex)随意命名组)。那样的话,你可以用

    Pattern p = Pattern.compile("(?<key>\\w+)\\s*:\\s*(?<value>\\w+)");
    Matcher m = p.matcher(yourData);
    while(m.find()){
        System.out.println("key = " + m.group("key"));
        System.out.println("value = " + m.group("value"));
        System.out.println("--------");
    }
    
  2. # 2 楼答案

    对于纯正则表达式解决方案,可以使用以下模式(注意开头的空格):

     ?: ?
    

    http://regexr.com/39evh

  3. # 3 楼答案

     String[] tokensVal = str.split(":");
     String key = tokensVal[0].trim();
     String value = tokensVal[1].trim();
    
  4. # 4 楼答案

    如果要使用String.split(),可以使用以下命令:

    String input = "key : value";
    String[] s = input.split("\\s*:\\s*");
    String key = s[0];
    String value = s[1];
    

    这将在“:”处拆分字符串,但在“:”前面添加所有空格,这样您将收到一个经过修剪的字符串

    说明:

    • \\s*将匹配任何空格,默认情况下这等于[ \\n\\r\\t]*
    • 两个\\s*之间的:表示您的:需要在那里

    请注意,如果输入行不包含定义的键值格式,则此解决方案将导致ArrayIndexOutOfBoundsException

    如果您不确定该行是否真的包含键值字符串,可能是因为您希望在文件末尾像通常那样有一个空行,您可以这样做:

    String input = "key : value";
    Matcher m = Pattern.compile("(\\S+)\\s*:\\s*(.+)").matcher(input);
    if (m.matches())
    {
        String key = m.group(1); // note that the count starts by 1 here
        String value = m.group(2);
    }
    

    说明:

    • \\S+匹配任何非空白字符串-如果它包含空白,则正则表达式的下一部分将与此表达式匹配。请注意,它周围的()标记,以便您可以通过m.group()获得它的值
    • \\s*将匹配任何空格,默认情况下这等于[ \\n\\r\\t]*
    • 两个\\s*之间的:表示您的:需要在那里
    • 最后一个组.+将匹配任何字符串,包括空格等
  5. # 5 楼答案

    您可以使用split方法,但可以将分隔符传递为“:”

    这会在看到“:”时分割字符串,然后可以修剪值以获得键和值

    String s = "   keys : value   ";
    String keyValuePairs[] = s.split(":");
    String key = keyValuePairs[0].trim();
    String value = keyValuePairs[1].trim();
    

    您还可以使用regex来简化它

    String keyValuePairs[] = s.trim().split("[ ]*:[ ]*");
    

    s.trim()将删除字符串前后的空格(如果您的案例中有空格),因此sting将变成“keys:value”并

    [ ]*:[ ]* 
    

    使用表示空格(一个或多个):空格(一个或多个)作为分隔符的正则表达式拆分字符串