我需要用正则表达式解析以下字符串。我想用参数之间的任何空格解析这个字符串,并以不同的顺序解析参数。字符串始终以ECC开头,但ID之类的其他参数可以放在最后,签名可以在ECC之后开始。
EAN CID=55505, APIKey=cbrzfta369qwyrm9t5b8y8kf, Signature=60955d3260415e69c0a305c42083415b
目前我正在使用以下正则表达式
^EAN cid=([0-9]+), *apikey=([a-zA-Z0-9]+)(, *signature=([a-fA-F0-9]+))?$
但如果参数的顺序相反,则无效。
例如:
ECC Signature=60955d3260415e69c0a305c42083415b, Key=cbrzfta369qwyrm9t5b8y8kf, Id=123
请尽可能纠正我的正则表达来帮助我。
答案 0 :(得分:0)
这是一个使用String.split()
的想法,它将结果放在HashMap
中,以便您可以轻松地按键名称拉出参数。
public static void main(String[] args) {
String params = "ECC Signature=60955d3260415e69c0a305c42083415b, Key=cbrzfta369qwyrm9t5b8y8kf, Id=123";
String[] parsed = params.split("=|,\\s*" );
System.out.println( Arrays.toString( parsed ) );
Map<String,String> paramMap = arrayToMap( parsed );
System.out.println( paramMap );
}
private static Map<String, String> arrayToMap(String[] parsed) {
Map<String,String> map = new HashMap<>();
for( int i = 0; i+1 < parsed.length; i+=2 )
map.put( parsed[i],parsed[i+1]);
return map;
}
我将参数化的arrayToMap
方法保留了下来,因此很容易理解,但它可以通用如下(编辑:更聪明的通用代码):
public static <T,U extends T> Map<T, T> arrayToMap( U[] parsed) {
Map<T,T> map = new HashMap<>();
for( int i = 0; i+1 < parsed.length; i+=2 )
map.put( parsed[i],parsed[i+1]);
return map;
}
答案 1 :(得分:0)
符合ECC要求的一个示例。 FYI。
String base = "(?:\\s*(?:(?:id=([0-9]+))|(?:key=([a-zA-Z0-9]+))|(?:signature=([a-fA-F0-9]+))),?)";
String patternStr ="ECC " + base + "+$";
String str = "ECC Signature=60955d3260415e69c0a305c42083415b, Key=cbrzfta369qwyrm9t5b8y8kf, Id=123";
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(str);
while (m.find()) {
System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
输出结果为:
ECC Signature=60955d3260415e69c0a305c42083415b, Key=cbrzfta369qwyrm9t5b8y8kf, Id=123
123
cbrzfta369qwyrm9t5b8y8kf
60955d3260415e69c0a305c42083415b
如果输入字符串是:
String str = "ECC Id=123, Key=cbrzfta369qwyrm9t5b8y8kf, Signature=60955d3260415e69c0a305c42083415b";
输出结果为:
ECC Id=123, Key=cbrzfta369qwyrm9t5b8y8kf, Signature=60955d3260415e69c0a305c42083415b
123
cbrzfta369qwyrm9t5b8y8kf
60955d3260415e69c0a305c42083415b