java仅在第一次出现“=”时分割

ukdjmx9f  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(363)

尝试拆分输入,如下面的示例所述
它适用于,例如:

"Data Structures=Coding,Sports=Football,Capital=Delhi";

但不是为了:

"Data Structures=Cod=ing,Sports=Football,Capital=Delhi";

我想忽略第二个 = 在“编码”这个词以及它之后的所有内容中,我们如何才能做到这一点?我们能用正则表达式吗?Guava切碎机限值?

public static void main(String[] args)
{
    // This String contains key-value pairs.
    String value
        = "Data Structures=Coding,Sports=Football,Capital=Delhi";

    Map<String, String>
        mp
        = Splitter.on(',')
              .withKeyValueSeparator('=')
              .split(value);
eoigrqb6

eoigrqb61#

有很多方法可以实现你想要的。一个简单的方法是使用 String#substring 获取键所需的子字符串和所需的 Map .

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi";

        Map<String, String> map = 
                Arrays.stream(str.split(","))
                .filter(s -> s.indexOf('=') != -1)
                .collect(Collectors.toMap(
                            s -> s.substring(0, s.indexOf('=')), 
                            s -> s.substring(s.indexOf('=') + 1)
                        )
                );

        System.out.println(map);
    }
}

输出:

{Data Structures=Cod=ing, Capital=Delhi, Sports=Football}

如果你想消除第二个 = ,您可以将其替换为 "" 如下图所示:

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi";

        Map<String, String> map = 
                Arrays.stream(str.split(","))
                .filter(s -> s.indexOf('=') != -1)
                .collect(Collectors
                        .toMap(s -> 
                            s.substring(0, s.indexOf('=')), 
                            s -> s.substring(s.indexOf('=') + 1).replace("=", "")
                        )
                );

        System.out.println(map);
    }
}

输出:

{Data Structures=Coding, Capital=Delhi, Sports=Football}
68bkxrlz

68bkxrlz2#

问题:
我想忽略单词coding中的第二个“=”以及后面的所有内容
消除第二个 = 之后,请使用:

replaceAll("(=[^=,]*)=[^,]*", "$1")

测试

String value = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi";

Map<String, String> mp = Splitter.on(',')
        .withKeyValueSeparator('=')
        .split(value.replaceAll("(=[^=,]*)=[^,]*", "$1"));

System.out.println(mp);

输出

{Data Structures=Cod, Sports=Football, Capital=Delhi}

评论如下:
我想把数据放在第二个“=”之后,然后去掉第二个“=”
使用java 9+可以这样做:

String value = "Data Structures=Cod=in=g,Sports=Football,Capital=Delhi";

Map<String, String> mp = Splitter.on(',')
        .withKeyValueSeparator('=')
        .split(Pattern.compile("(=[^=,]*)=([^,]*)").matcher(value)
                      .replaceAll(m -> m.group(1) + m.group(2).replace("=", "")));

System.out.println(mp);

输出

{Data Structures=Coding, Sports=Football, Capital=Delhi}
nxowjjhe

nxowjjhe3#

我不知道Guava,但知道标准 java split() 方法具有第二个参数(通常受监督),该参数限制结果大小或更好,即搜索分隔符的频率:

String value = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi";
Map<String, String> mp = 
    Pattern.compile(",")
    .splitAsStream(value)
    .map(s -> s.split("=", 2))
    .collect(Collectors.toMap(a -> a[0], a -> a[1]));

要忽略除第一个等号以外的所有等号,即从值部分删除所有等号,只需添加替换,如:

String value = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi";
Map<String, String> mp = 
    Pattern.compile(",")
    .splitAsStream(value)
    .map(s -> s.split("=", 2))
    .collect(Collectors.toMap(a -> a[0], a -> a[1].replace("=","")));

如果任何条目(逗号之间的字符串)没有等号,这将引发异常。要避免这种情况,请向流中添加筛选器:

String value = "Data Structures=Cod=ing,Sports=Football,Capital=Delhi,Error";
Map<String, String> mp = 
    Pattern.compile(",")
    .splitAsStream(value)
    .map(s -> s.split("=", 2))
    .filter(a -> a.length == 2)
    .collect(Collectors.toMap(a -> a[0], a -> a[1].replace("=","")));

相关问题