使用Java/Regex验证和解析key=value对字符串

使用Java/Regex验证和解析key=value对字符串,java,regex,Java,Regex,如何使用Java/Regex验证键=值对字符串 样本输入: key1=5&key2=8&key3=10 配对-允许任意数量的配对,用符号和分隔,由key=value 键-将是一个典型的变量名 值-只能是整数 分隔符-线对由符号和分隔 第一次尝试可以如下所示: String input = "key1=5&key2=8&key3=10" Pattern p=Pattern.compile("([a-z]\\=\\d[&])"); 目标应该是 可以验证

如何使用Java/Regex验证键=值对字符串

样本输入:

key1=5&key2=8&key3=10
  • 配对-允许任意数量的配对,用符号和分隔,由
    key=value
  • 键-将是一个典型的变量名
  • 值-只能是整数
  • 分隔符-线对由符号和分隔
第一次尝试可以如下所示:

String input = "key1=5&key2=8&key3=10"
Pattern p=Pattern.compile("([a-z]\\=\\d[&])");
目标应该是

  • 可以验证字符串的语法
  • 可以解析出键/值对以进行进一步处理

  • 假设您希望验证由符号分隔的“key=value”对列表,以及URL的查询部分的构建方式,那么您可以使用以下正则表达式:

    ^(?:\w*=\d*(?:&|$))+$
    
    (?:(\w*)=(\d*)(?=&|$))
    
    或转换为java正则表达式:

    String input = "one=1&two=2";
    Pattern p = Pattern.compile("^(?:\\w*=\\d*(?:&|$))+$");
    Matcher m = p.matcher(input);
    if (m.matches()) System.out.println("Matches!");
    
    这是假设

    • 键是一系列单词字符:
      \w*
    • 值是一个数字序列:
      \d*
    • 键=值对以与结束,除非它是最后一对:
      (?:&|$)
    • 可以有任意数量的对,但最少1对
    上述方法仅适用于验证字符串从头到尾的有效性,不适用于提取单个数据部分。但是,如果要提取每个键/值对,则需要一种稍微不同的方法。在这种情况下,您将使用以下正则表达式:

    ^(?:\w*=\d*(?:&|$))+$
    
    (?:(\w*)=(\d*)(?=&|$))
    
    或者在Java程序中:

    String input = "one=1&two=2";
    Pattern p = Pattern.compile("(?:(\\w*)=(\\d*)(?=&|$))");
    Matcher m = p.matcher(input);
    while (m.find()) {
      System.out.println("key="+m.group(1));
      System.out.println("value="+m.group(2));
    }
    
    如果确实需要检查键和值在某种程度上是否相等(
    one
    作为单词与
    1
    numeric),那么这可以通过编程实现,因为
    =
    的左右两边已经被解析了

    ^(([^=&]+=[^=&]+)(&([^=&|]+=[^=&]+))*)+
    
    以下是测试用例

  • k=v->匹配
  • k=v&->不匹配
  • k=v&k=v->匹配
  • k=v&k=v&->不匹配
  • k=v&k=v&k=v->匹配

  • “一=4&三=6”是否有效?为什么是正则表达式?如果s等于(“1=1&2=2”),为什么不直接说
    ?(问题是,您当然希望匹配除此之外的其他字符串。但是,除非您提示要匹配的字符串,否则我们无法帮助您。我们不是读心术的人。)