자바 정규 표현 식 이 결과 에 맞지 않 는 해결
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()를 사용 하 는 것 이 편리 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.