Key =使用正则表达式验证值对

时间:2013-12-03 17:43:38

标签: java regex validation

需要使用正则表达式验证以下字符串:

Key=Value;Key=Value;Key=Value and so on

例如:MAC Address=192.167.235.19; zproduct_id=XYZ

  1. 键和值可以包含除=和;
  2. 之外的任何内容
  3. 键和值都不能为空白或为空时使用sapces
  4. 输入字符串不以;
  5. 结尾

    尝试使用以下正则表达式

    Pattern pattern1 = Pattern.compile("(([^=;]*)=([^=;]*);?)+");
    Matcher matcher = pattern1.matcher("MAC Address=192.167.235.19; zproduct_id=XYZ");
    if (matcher.matches())
    System.out.println("Match");
    else
    System.out.println("NOT");
    

    以下是带有输入字符串

    的上述正则表达式的验证结果
    Input String                                      Validation Result  Expected Result
    
    1. MAC Address=192.167.235.19                         Match              Match
    2. MAC Address=192.167.235.19; zproduct_id=XYZ        Match              Match
    3. MAC Address=192.167.235.19;                        Match              Not
    4. MAC =Address=192.167.235.19; zproduct_id=XYZ       Match              Not
    5. MAC Address=; zproduct_id=XYZ                      Match              Not  
    6. MAC Address=     ; zproduct_id=XYZ                 Match              Not  
    7.     =192.167.235.19 ; zproduct_id=XYZ              Match              Not
    

    请建议一个正则表达式,该表达式将验证所有上述方案的预期结果。

    先谢谢

5 个答案:

答案 0 :(得分:1)

这稍微复杂一点。

编辑,强制执行必须是不是空格(也不是空)的值。
否则,=;=;=;=;=;=;=;=将有效 所以这将是有效的Key1 = ;Key2=val; Key1= val

 # "^(?:\\s*((?:[^=;\\s]+\\s+)*[^=;\\s]+)\\s*=\\s*([^=;]*)(?:;(?!\\s*$)|$))+$"

 ^ 
 (?:
      \s* 
      (                             # (1 start)
           (?: [^=;\s]+ \s+ )*
           [^=;\s]+ 
      )                             # (1 end)
      \s* 
      =
      \s* 
      ( [^=;]* )                    # (2)
      (?:
           ; (?! \s*  $ )
        |  $ 
      )

 )+
 $

Edit2 这会强制不能是空白(也不是空)。

 #   "^(?:\\s*((?:[^=;\\s]+\\s+)*[^=;\\s]+)\\s*=\\s*((?:[^=;\\s]+\\s+)*[^=;\\s]+)\\s*(?:;(?!\\s*$)|$))+$"

 ^ 
 (?:
      \s* 
      (                             # (1 start), Key
           (?: [^=;\s]+ \s+ )*
           [^=;\s]+ 
      )                             # (1 end)
      \s* 
      =
      \s* 
      (                             # (2 start), Value
           (?: [^=;\s]+ \s+ )*
           [^=;\s]+ 
      )                             # (2 end)
      \s* 
      (?:
           ;
           (?! \s*  $ )
        |  $ 
      )
 )+
 $ 

答案 1 :(得分:0)

使用此正则表达式:

Pattern pattern1 = Pattern.compile("([^=;]*)=([^=;]*)(?:;|$) *");

而不是:

if (matcher.matches()) {...}

使用Matcher#find()

while ( matcher.find() ) {
   System.out.println("key: " + matcher.group(1) + ", value: " + matcher.group(2));
}

答案 2 :(得分:0)

尝试使用下一个正则表达式:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("^(([^=;]+)=([^=;]+);?\\s*)*$");

来自https://www.debuggex.com/

enter image description here

答案 3 :(得分:0)

在您的示例中,看起来每个key=value对(除了最后一个)之后应该有;。要表达这一事实,请尝试更改正则表达式,并将;?替换为(;(?!$)|$)(仅当数据后面没有数据结尾时才会接受;,或者接受数据结束)。

如果keyvalue无效,请将*更改为+

试试这个正则表达式"([^=;]+=[^=;]+(;(?!$)|$))+"


演示:

String[] tests = { 
        "MAC Address=192.167.235.19",
        "MAC Address=192.167.235.19; zproduct_id=XYZ",
        "MAC Address=192.167.235.19; ",
        "MAC =Address=192.167.235.19; zproduct_id=XYZ",
};

for (String s : tests)
    System.out.println(s + " -> " + s.matches("([^=;]+=[^=;]+(;|$))+"));

输出:

MAC Address=192.167.235.19 -> true
MAC Address=192.167.235.19; zproduct_id=XYZ -> true
MAC Address=192.167.235.19;  -> false
MAC =Address=192.167.235.19; zproduct_id=XYZ -> false

答案 4 :(得分:0)

虽然正则表达式提供了最简洁的答案,但通过循环子字符串进行验证可能更直接:

final List<String> inputList = Arrays.asList(
    "MAC Address=192.167.235.19",
    "MAC Address=192.167.235.19; zproduct_id=XYZ",
    "MAC Address=192.167.235.19;",
    "MAC =Address=192.167.235.19; zproduct_id=XYZ"
);

for (String str : inputList) {
    System.out.println(str);
    final String[] keyVals = str.split(";", -1);
    boolean valid = keyVals.length > 0;
    for (String keyVal : keyVals) valid &= keyVal.split("=", -1).length == 2;
    System.out.println(valid);
}