Java 如何使用正则表达式删除HashMap中具有字母数字值的条目?

Java 如何使用正则表达式删除HashMap中具有字母数字值的条目?,java,regex,hashmap,Java,Regex,Hashmap,我有一个包含键和值的HashMap。所有键和值都是来自传感器的字符串类型。比如说 map = { temperature: "35.6", pressure: "1012", station_type: "FM-17" . . . } 现在,我想从地图中删除包含字母数字值的键,在本例中,为station_类型,只保留温度和压力 我用正则表达式试过了,但不起作用。有人能告诉我下面的代码有什么问题吗 for(String m:keyValueRecord.keySet()){ if(keyV

我有一个包含键和值的HashMap。所有键和值都是来自传感器的字符串类型。比如说

map = {
temperature: "35.6",
pressure: "1012",
station_type: "FM-17"
.
.
.
}
现在,我想从地图中删除包含字母数字值的键,在本例中,为station_类型,只保留温度和压力

我用正则表达式试过了,但不起作用。有人能告诉我下面的代码有什么问题吗

for(String m:keyValueRecord.keySet()){
   if(keyValueRecord.get(m).matches("^[a-zA-Z0-9]")){
      keyValueRecord.remove(m);
}
}

另外,有没有其他不使用regex的方法可以做到这一点?

这里:
^[a-zA-Z0-9]


匹配1a-Z,0-9个字符。你的意思是要匹配一个或多个吗

使用Java8,您可以用以下方式编写它:

keyValueRecord.entrySet().stream()
 .filter((k, v) -> k.matches("^[a-zA-Z0-9]+"))
 .collect(toMap(MapEntry::getKey, MapEntry::getEntry))

除了正则表达式之外,以这种方式在其键集上迭代时修改映射是无效的。它可能抛出
ConcurrentModificationException
或产生未定义的结果

为了在对映射进行迭代时删除元素,需要显式使用迭代器

final Iterator<Map.Entry<String, String>> iterator = keyValueRecord.entrySet().iterator();
while (iterator.hasNext()) {
    final Map.Entry<String, String> entry = iterator.next();
    if (entry.getValue().matches("[a-zA-Z0-9]*")) {
        iterator.remove();
    }
}

我相信
removeIf
可以是
键集上的一个选项

keyValueRecord.keySet().removeIf(k -> keyValueRecord.get(k).matches("^[a-zA-Z0-9]"));

如果我正确理解了这个问题,那么如果该值为字母数字,您希望删除该条目。例如

map = {
temperature: "35.6",
pressure: "1012",
station_type: "FM-17"
.
.
.
}
输入:
{温度=35.6,压力=1012,电台类型=FM17,电台类型3=FM-@17,电台类型2=FM,电台类型1=FM}

预期输出:
{温度=35.6,压力=1012,电台类型2=fm,电台类型1=fm}

String onlyNumbers=“^[0-9.]*$”;
字符串onlylphabets=“[a-zA-Z]*$”;
final Iterator Iterator=map.entrySet().Iterator();
while(iterator.hasNext()){
final Map.Entry=iterator.next();
如果(!entry.getValue().matches(onlyNumbers)和&!entry.getValue().matches(onlyAlphabets)){
iterator.remove();
}
}
或Java8

map.entrySet().removeIf(entry->!entry.getValue().matches(onlyNumbers)和&!entry.getValue().matches(onlylpabets));

如果(m.匹配(“[a-zA-Z0-9]+”),则使用
。您没有匹配
而不是
这将创建一个新的映射,而不是修改现有的映射。好的,这对字母数字很有效,但是如果我还想删除station_type2和station_type1呢?为了让它更复杂,处理所有情况(即字母数字,仅alph)的通用正则表达式是什么教唆,只有数字,带有特殊字符的数字和带有特殊字符的字母?@tank我的答案只会满足这里发布的问题。如果你想删除station_type2和station_type1,那么你可以删除唯一的字母检查,然后只会得到温度和压力值。如果答案正确,意味着您只检查了数字。@如果您想要“只有字母或只有带有特殊字符的数字或数字或带有特殊字符的字母”,您可以使用“[0-9.]*.[a-zA-Z]*.[^a-zA-Z]*.[^0-9.]*”。此表达式删除除station类型之外的所有其他条目。当我稍微修改一下时,它可以很好地工作map.values()。removeIf(value->!value.matches(“^[a-zA-Z0-9.]*$”);