【发布时间】:2023-04-11 11:57:01
【问题描述】:
我的字符串是“我是 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));
}
}
});
但我希望它在一张地图中
【问题讨论】:
-
你的正则表达式不正确,看起来你想使用
I am new to Java (.*)(*是一个量词,它通过指定它应该出现的次数来修改前一个标记;(不是一个可量化的标记;.,将匹配任何字符,是) -
我用 (.*) 还是不行
-
怎么不工作?是否有错误消息或意外结果?
-
添加了它@Aaron
-
您的新地图是使用
p.getValue()作为值创建的,因此您不应期望该值会神奇地成为您的正则表达式捕获的Java 版本号。看起来您的过滤器没问题(尽管第一个条件是多余的:如果您的正则表达式匹配,则密钥显然包含“Java”)但您的收集器需要使用Pattern和Matcher从匹配的文本。