2013-12-19 2 views
0

Вот мой класс, я в середине написания:Почему это регулярное выражение не находит совпадение?

public class MtomParser { 

    private static final String HEADER_REGEX = "^\\s*Content-ID:"; 

    public boolean isMtom(String payload) { 
     return payload.contains("--uuid"); 
    } 

    public String parseMtom(String mtomResponse) { 
     while (mtomResponse.matches(HEADER_REGEX)) { 
      System.out.println("header found"); 
     } 
     return mtomResponse; 
    } 
} 

Я ожидаю, что мой вклад, чтобы сделать этот код вызывает бесконечный цикл, так как он должен найти матч, и нет никакого способа, чтобы избежать петли. Но, mtomResponse.matches(HEADER_REGEX) возвращает false каждый раз, и я не уверен, почему. Вот mtomResponse:

--uuid:b6bd1ef2-63e2-4d8d-8bac-eabbe7588373 
     Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"; 
     Content-Transfer-Encoding: binary 
     Content-ID: <[email protected]> 

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Header/><soap:Body><RetrieveDocumentSetResponse xmlns="urn:ihe:iti:xds-b:2007" xmlns:ns10="http://docs.oasis-open.org/wsrf/bf-2" xmlns:ns11="http://docs.oasis-open.org/wsn/t-1" xmlns:ns12="urn:gov:hhs:fha:nhinc:common:subscriptionb2overridefordocuments" xmlns:ns13="http://nhinc.services.com/schema/auditmessage" xmlns:ns14="urn:oasis:names:tc:emergency:EDXL:DE:1.0" xmlns:ns15="http://www.hhs.gov/healthit/nhin/cdc" xmlns:ns16="urn:gov:hhs:fha:nhinc:common:subscriptionb2overrideforcdc" xmlns:ns2="urn:gov:hhs:fha:nhinc:common:nhinccommon" xmlns:ns3="urn:gov:hhs:fha:nhinc:common:nhinccommonentity" xmlns:ns4="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:ns5="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" xmlns:ns6="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:ns7="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:3.0" xmlns:ns8="http://docs.oasis-open.org/wsn/b-2" xmlns:ns9="http://www.w3.org/2005/08/addressing"><ns5:RegistryResponse status="urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success"/><DocumentResponse><HomeCommunityId>urn:oid:422.422</HomeCommunityId><RepositoryUniqueId>422.422</RepositoryUniqueId><DocumentUniqueId>422.422^C4n2hv7z_5Ofa37W</DocumentUniqueId><mimeType>text/xml</mimeType><Document><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:[email protected]%3Aihe%3Aiti%3Axds-b%3A2007"/></Document></DocumentResponse></RetrieveDocumentSetResponse></soap:Body></soap:Envelope> 
     --uuid:b6bd1ef2-63e2-4d8d-8bac-eabbe7588373 
     Content-Type: text/xml 
     Content-Transfer-Encoding: binary 
     Content-ID: <[email protected]:ihe:iti:xds-b:2007> 

     <?xml version="1.0" encoding="UTF-8"?> 
<ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" xsi:schemaLocation="urn:hl7-org:v3 http://hit-testing.nist.gov:11080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd"> 
<realmCode code="US"/> 
<typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/> 

В моем IDE, если поиск по регулярному выражению из ^\s*Content-ID:, он находит 2 результаты. Так почему же этот Java-код не находит совпадений?

ответ

4

Вам нужно включить режим MULTILINE, чтобы разрешить ^ для соответствия каждой строке, а не всей строки.

Pattern pattern = Pattern.compile(yourRegex, Pattern.MULTILINE); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

См: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

+0

Да, это фиксированная моя проблема. Я не знаю, как я никогда не сталкивался с этой проблемой раньше ... Почему 'find()' работает, но 'matches()' не делает? –

+1

'String.matches()' является удобным методом и не использует режим MULTILINE. Было бы хорошо, если бы они включили другой метод с флагами в качестве параметра. Но они этого не сделали, поэтому вы должны сделать это долгий путь :) –

Смежные вопросы