繁体   English   中英

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

[英]Key=Value pair validation using Regular Expression

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

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

例如: MAC Address=192.167.235.19; zproduct_id=XYZ MAC Address=192.167.235.19; zproduct_id=XYZ

  1. 键和值可以包含除=和;之外的任何内容。
  2. 键和值都不能为空或带空格的空
  3. 输入字符串不以;结尾

尝试使用以下正则表达式

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

请提出一个正则表达式,该表达式将验证所有上述情况的预期结果。

提前致谢

这有点复杂。

编辑此代码将强制Key必须是非空格(也不为空)的值。
否则, =;=;=;=;=;=;=;=将是有效的。
因此这将是有效的Key1 = ;Key2=val; Key1= val 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*  $ )
        |  $ 
      )
 )+
 $ 

使用此正则表达式:

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

代替:

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

使用Matcher#find()

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

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

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

https://www.debuggex.com/

在此处输入图片说明

从您的示例看来,每个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

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

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM