Issue title: Unable to validate a  json that contains a arraylist with groovy contract
 Issue body: I have already reported same issue(#817) and since it is closed so raising new one. I  currently developing a spring cloud project where I need to validate a JSON request. My json includes an array list, here I am facing issues while validating a particular element of the array list. My groovy contract at producer end looks like as below:

`package contracts.beer.rest
import org.springframework.cloud.contract.spec.Contract

    Contract.make{

    description("""
    Validating A CWP MO For New Customer
    """)

    request{

        method 'POST'
        url    '/ValidateMO'
        body(file("cwp_mo.json"))
        bodyMatchers {
            jsonPath('$.id',byRegex("[0-9]{2}"))
            jsonPath('$.name',byRegex('[A-Za-z]+'))
            jsonPath('$.age',byRegex('[2-9][0-9]'))
            jsonPath('$.salary',byRegex('[1-9][0-9]{5}'))
            jsonPath('$.designation',byRegex('[A-Za-z]+'))
            jsonPath("\$.['addressList'][*].['zipCode']", byRegex('[0-9]{5}'))

        }
        headers {
            contentType(applicationJson())
        }
    }
    response{
        status 200
        body("""
     {
     "status":"OK"
     }
     """)
        headers{
            contentType(applicationJson())
        }
    }
    }'

and corresponding stub generated for this contract is:

`{
  "id" : "3592fe24-24d3-4040-a5b1-8287654348da",
  "request" : {
    "url" : "/ValidateMO",
    "method" : "POST",
    "headers" : {
      "Content-Type" : {
        "matches" : "application/json.*"
      }
    },
    "bodyPatterns" : [ {
      "matchesJsonPath" : "$.['addressList'][*][?(@.['street'] == 'Park Avny')]"
    }, {
      "matchesJsonPath" : "$.['phoneNumbers'][?(@ == '987654')]"
    }, {
      "matchesJsonPath" : "$.['addressList'][*][?(@.['city'] == 'West chester')]"
    }, {
      "matchesJsonPath" : "$.['phoneNumbers'][?(@ == '123456')]"
    }, {
      "matchesJsonPath" : "$.['addressList'][*][?(@.['street'] == 'Park Avn')]"
    }, {
      "matchesJsonPath" : "$.['personalInformation'][?(@.['gender'] == 'Male')]"
    }, {
      "matchesJsonPath" : "$.['personalInformation'][?(@.['maritialstatus'] == 'married')]"
    }, {
      "matchesJsonPath" : "$[?(@.id =~ /([0-9]{2})/)]"
    }, {
      "matchesJsonPath" : "$[?(@.name =~ /([A-Za-z]+)/)]"
    }, {
      "matchesJsonPath" : "$[?(@.age =~ /([2-9][0-9])/)]"
    }, {
      "matchesJsonPath" : "$[?(@.salary =~ /([1-9][0-9]{5})/)]"
    }, {
      "matchesJsonPath" : "$[?(@.designation =~ /([A-Za-z]+)/)]"
    }, {
      "matchesJsonPath" : "$.['addressList'][*][?(@.['zipCode'] =~ /([0-9]{5})/)]"
    } ]
  },
  "response" : {
    "status" : 200,
    "body" : "{\"status\":\"OK\"}",
    "headers" : {
      "Content-Type" : "application/json"
    },
    "transformers" : [ "response-template" ]
  },
  "uuid" : "3592fe24-24d3-4040-a5b1-8287654348da"
}`
Here addressList can contain multiple addresses. so at consumer end suppose I have two different addresses, if pass wrong value of zipcode for both addresses then my testcase got failed, but if I pass one zipcode as wrong and another one correct in that scenario testcase got executed successfully which is wrong behavior. 

In my previous case(Case no:817), you suggested to use bodyMatcher and define an entry with index [0]. 
But I want to make it generic... instead of using index[0] or index[1], I want to use *, so that it fails when any of the zipcode is wrong at any index. After writing the validation part in bodyMatcher, it is still failing.

Providing consumer end testcase also:

`@Test
       public void validateMO() throws Exception {
        long[] phnNum={12345,56789};
        HashMap<String,String> personalInformation=new HashMap<String,String>();
        personalInformation.put("gender","Male");
        personalInformation.put("maritialstatus","Unmarried");
        BigDecimal sal=new BigDecimal(100000);
        List<Address> addressList =new ArrayList<>();
        addressList.add(new Address("Park Avn","West chester",123451));
        addressList.add(new Address("Park Avn","West chester2",56789));
        mockMvc.perform(MockMvcRequestBuilders.post("/validate")
                .contentType(MediaType.APPLICATION_JSON)
                .content(json.write(new Employee(12,"Aman",25,sal,"Programmer",addressList,phnNum,personalInformation)).getJson()))
                .andExpect(status().isOk())
                .andExpect(content().string("THERE YOU GO"));
        //remov38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5end[]
    }`

Can you please tell now what is wrong. Thanks in Advance.
 Comments: 
 Comment 0: I don't think you can do it in JSON Path. Remember however that it's a contract test. You should verify if you can communicate properly. Just fix the size to be e.g. 2 and ensure via the index entries that both json paths are matched. Then on the client side, someone will need to assert against a list of 2 and 2 only. As a client, if those tests pass then it means that the rest of the tests doesn't need to be executed against the stubs.
 Comment 1: Thanks for your feedback.
{'source': 'GithubIssues', 'repo_name_with_owner': 'spring-cloud/spring-cloud-contract', 'issue_id': 391643397, 'repo_stars': 676.0}