正则表达式帮助以任何顺序解析字符串

时间:2014-08-05 22:34:25

标签: java regex

我需要用正则表达式解析以下字符串。我想用参数之间的任何空格解析这个字符串,并以不同的顺序解析参数。字符串始终以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

请尽可能纠正我的正则表达来帮助我。

2 个答案:

答案 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