자바 정규 표현 식 이 결과 에 맞지 않 는 해결

다음 과 같다.

String str = "\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?><Response xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Header ShouldRecordPerformanceTime=\"false\" Timestamp=\"2018-6-25 21:24:03\" RequestID=\"2c4d0b24-fd48-4a92-a2d8-c66793df2059\" ResultCode=\"Success\" AssemblyVersion=\"2.9.5.0\" RequestBodySize=\"0\" SerializeMode=\"Xml\" RouteStep=\"1\" Environment=\"pro\" /><SSPATResponse><Result>0</Result><FareDetail /><Price>0</Price><ErrCode>102</ErrCode><DetailInfo>Send:APPLOCK
" + "Rev:
" + " , 60 Buk
" + "Send:IG
" + "Rev:
" + "NO PNR
" + "Send:
" + "SS:AA186/N/27JUN18/PEKORD/NN1;
" + "Rev:
" + "AA 186 N 27JUN PEKORD NN1 WL OPEN
" + "UNABLE TO SELL.PLEASE CHECK THE AVAILABILITY WITH \"AV\" AGAIN
" + "Send:IG
" + "Rev:</DetailInfo><PatOfficeno>SHA717</PatOfficeno></SSPATResponse><ResponseStatus><Timestamp xmlns=\"http://soa.ctrip.com/common/types/v1\">2018-06-25T21:24:03.4535624+08:00</Timestamp><Ack xmlns=\"http://soa.ctrip.com/common/types/v1\">Success</Ack></ResponseStatus></Response>"; String regex = "<DetailInfo>((.|\
")*?)</DetailInfo>";
str 는 일치 하 는 문자열(들 어 오 는 것)이 고,regex 는 정규 표현 식 입 니 다.
목적 은탭 의 내용 과 일치 하 는 것 입 니 다.
로 컬 테스트 에 서 는 일치 할 수 있 지만 온라인 에 서 는 안 됩 니 다.
정말 아무리 생각해 도 이해 가 안 돼..
나중에 온라인 에 들 어 오 는 str 와 로 컬 복사 한 str 를 진지 하 게 비교 해 보 니 작은 차이 점 을 발견 했다.
온라인 에서 들 어 오 는 str 줄 구분 자 는\r 이 고 복사 해서 로 컬 에 붙 여 넣 으 면 모두 변 합 니 다.
내 정규 표현 식 에 일치 하 는 경우 만 있 기 때문에 이러한 bug 가 발생 합 니 다.
시스템 간 의 차이 에 주의 하 라 고 자신 에 게 일 깨 워 줍 니 다.win 의 줄 구분 자 는'리 눅 스 는'\r'입 니 다.
모든 환경 에 맞 게 System.lineSeparator()로 대체 할 수 있 습 니 다.물론 표현 식 을 이렇게 쓸 수도 있 습 니 다(

<DetailInfo>((.|\
|\\r\
")*?)</DetailInfo>
추가:자바 정규 표현 식 과 일치 하 는 구덩이
오늘 은 문자열 에 어떤 문자열 이 존재 하 는 지 판단 하고 있 습 니 다.String.matches(regex)를 직접 사용 하면 일치 하지 않 습 니 다.온라인 정규 도 구 는 많은 것 을 사용 할 수 있 습 니 다.나중에 문 제 를 찾 아 다시 구 덩이 를 밟 지 않도록 정리 하 겠 습 니 다.
전제
자바 에서 문자열 에 어떤 문자열 이 포함 되 어 있 는 지 판단 하 는 방식:
1、#

String.matches(regex);
원본 코드 를 읽 어 보 니 이 방법 은 본질 적 으로 Pattern.matches(regex,str)를 호출 한 것 이 고,이 방법 은 Pattern.copile(regex).matcher(input).matches()방법 으로 전체 영역 을 패턴 과 일치 시 키 려 고 하 며,일치 하면 시작,종료,그룹 방법 으로 더 많은 정 보 를 얻 을 수 있 습 니 다.
즉,이 방법 은 표현 식 전후 에$(regex$)를 추가 합 니 다.이 문자열 에 모두 일치 합 니 다.
하위 문자열 만 일치 하지 않 습 니 다.하위 문자열 만 일치 하려 면 표현 식 이 전체 세그먼트 와 일치 해 야 합 니 다.
2、#

Pattern.compile(regex).matcher(str).find()
Matcher.find()방법 은 문자열 만 일치 하 는 방법 입 니 다.
전역 매 칭 을 사용 하지 않 으 려 면 Matcher.find()방법 을 사용 하 십시오.
2.소스 코드 첨부\#
1、String.matches(regex)#String.matches(regex)

public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}
Pattern.matches(regex, this)

public static boolean matches(String regex, CharSequence input) {
  Pattern p = Pattern.compile(regex);
  Matcher m = p.matcher(input);
  return m.matches();
}
2、Matcher.find()#Pattern.compile

public static Pattern compile(String regex) {
    return new Pattern(regex, 0);
}
Pattern.matcher

public Matcher matcher(CharSequence input) {
    if (!compiled) {
      synchronized(this) {
        if (!compiled)
          compile();
      }
    }
    Matcher m = new Matcher(this, input);
    return m;
}
Matcher.find()

public boolean find() {
    int nextSearchIndex = last;
    if (nextSearchIndex == first)
      nextSearchIndex++;
    // If next search starts before region, start it at region
    if (nextSearchIndex < from)
      nextSearchIndex = from;
    // If next search starts beyond region then it fails
    if (nextSearchIndex > to) {
      for (int i = 0; i < groups.length; i++)
        groups[i] = -1;
      return false;
    }
    return search(nextSearchIndex);
}
3.총화\#
각각 일치 하 는 장단 점 이 있 으 니,여러분 은 필요 에 따라 선택 하 실 수 있 습 니 다.
문자열 에 어떤 문자열 이 포함 되 어 있 는 지 만 가 져 오 려 면 Matcher.find()를 사용 하 는 것 이 편리 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기