Java 正则表达式与输入不匹配

时间:2021-03-15 18:58:35

标签: java regex

我在使用正则表达式时遇到问题。我想用 param 解析 url,它可以包含以下内容之一:

  • firstName:ar,lastName:smith,
  • firstName:ar,lastName:smith, addedAt<2020-03-15,
  • firstName:ar,lastName:smith,phone:123456789,
  • firstName:ar,lastName:smith,email:email@email.com,

每个键值必须以逗号(,)结尾

我有一个这样的正则表达式:

  • Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\p{Punct}?)((\\w+?)|((\\d{4}-\\d{2}-\\d{2})?+))(\\p{Punct}?),");
  • Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\p{Punct}?)[a-zA-Z](\\p{Punct}?),");

但除了第一种情况外,它不适用于上述输入。

请教一些如何正确构造Pattern的建议。

1 个答案:

答案 0 :(得分:2)

您拥有的是逗号分隔、冒号分隔的键值对。除非某些要求强制您使用正则表达式,根据您的评论它不会使用正则表达式,否则在逗号上拆分值,然后在冒号上拆分结果数组的值。您最终会得到一个数组,其中索引 0 是键,索引 1 是值。

在以下示例中,使用 OP 中提供的值之一,我们在逗号上拆分并循环遍历结果数组,拆分冒号上的每个索引并将其添加到每次迭代的列表中。

String value= "firstName:ar,lastName:smith,email:email@email.com,"
Map<String,String> keyValuePairs = new HashMap<>();
for (String kvp : value.split(",")) {
  String[] kvp = kvp.split(":");
  if (kvp.length != 2 || kvp[0].isEmpty()) {
    continue; //ignoring incorrectly formatted kvp
  }
  keyValuePairs.add(kvp[0], kvp[1]);
}
// do what you want with keyValuePairs;