[英]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
尝试使用以下正则表达式
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*)*$");
从您的示例看来,每个key=value
对(最后一个除外)都应该具有;
之后。 为了表达这一事实,请尝试更改您的正则表达式并替换;?
与(;(?!$)|$)
(它将接受;
仅当其后没有数据结尾时,否则将接受数据结尾)。
同样,如果key
或value
不能为空,则将*
更改为+
。
试试这个正则表达式"([^=;]+=[^=;]+(;(?!$)|$))+"
演示:
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.