从字符串java 8中获取不匹配的部分

时间:2017-10-06 16:20:22

标签: java regex java-8

我的字符串为“我是Java(*)的新手”

和我的实际字符串是我是Java 8的新手,我将从我的地图中获得一堆密钥,我需要在这里提取8个不匹配的部分

我的最终地图应该包含第一个字符串是键,值是不匹配的部分,我将如何在java 8中执行此操作

Pattern p =Pattern.compile("I am new to Java (*)");

map= map.entrySet()
        .stream()
        .filter(p -> p.getKey().contains("Java")&&p.getKey().matches("I am new to Java (*)"))
        .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

我正在使用下面的一个并且它打破了,有人可以建议吗?

我想要像

这样的东西
Map<String, String> result=map.entrySet().stream().filter(k-> k.getKey().matches(test) && k.getKey().contains(test))
        .collect(Collectors.toMap(k->k.getKey(), ::p.matcher().group(1)));

我能够使用两张地图实现它

Map<String, String> result = new HashMap<>();
map.forEach((k,v)->{
            if(k.contains(test)) {
                while(p.matcher(k).find()) {
                    result.put(k, p.matcher(k).group(1));
                }
            }
        });

但我想在一张地图中

2 个答案:

答案 0 :(得分:1)

如果我理解正确(并简化了你的例子):

String test = "I am new to Java 8 ";
String t = "I am new to Java (.*) ";
Map<String, String> map = new HashMap<>();
map.put(test, "value1");
map.put("some", "value2");

Map<String, String> result = map.entrySet()
            .stream()
            .filter(e -> !e.getKey().equals(e.getKey().replaceAll(t, "$1")))
            .collect(Collectors.toMap(
                    e -> e.getKey().replaceAll(t, "$1"),
                    Entry::getValue));

答案 1 :(得分:0)

我将如何做到这一点:

Pattern p = Pattern.compile("I am new to Java (.*)");
Predicate<String> regexFilter = p.asPredicate();

Function<String,String> versionExtractor = str -> {
  Matcher m = p.matcher(str);
  if (m.find()) {
    return m.group(1);
  } else {
    throw new IllegalArgumentException("It didn't match !"); // should never happen since we match beforehand
  }
};

Map<String,String> result = inputMap.keySet()
  .stream()
  .filter(regexFilter)
  .collect(Collectors.toMap(Function.identity(), versionExtractor));

如果我没有弄错的话,您遇到的问题是您无法在一个语句中将键映射到您的值,因为您需要先.matches才能.group

我们已经习惯了单行lambda(由函数式编程的强大功能),我们有时会忘记它们是普通的Function并且它们没有这样的限制。在这里,我使用{statements}块定义了我的lambda,并且我将lambda影响到一个变量,我之后在流处理中可以引用该变量。我本可以在流操作中直接定义lambda,或者我也可以在不使用lambda表示法的情况下实现Function

Try it here