需要使用正则表达式验证以下字符串:
Key=Value;Key=Value;Key=Value and so on
例如: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
请建议一个正则表达式,该表达式将验证所有上述方案的预期结果。
先谢谢
答案 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*)*$");
答案 3 :(得分:0)
在您的示例中,看起来每个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
答案 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);
}