이이 업데이트 (32) JRE 1.5 업데이트 (18)와 JRE 1.6 전에 최소한까지, 자바 클래스 라이브러리 (오라클에 인수 Sun의 구현)의 버그 (내가 테스트 한 2 가지 버전).
몇 가지 테스트 후, 긍정적 인 모습 숨김 (?<=pattern)
또한 부정적인 모습 숨김 (?<!pattern)
1, 2의 구현에 몇 가지 버그가 있습니다. 아마도 패턴이 다른 너비 인 경우 이 번갈아 가며 역 추적하는 방법과 관련이 있습니다. |
, 보이지 않는 비 캡처 그룹 내에 있습니다.
룩백의 항목 순서를 바꿀 때 가끔 이 작동하지만 부록 2에서는 항상 작동하지 않을 수도 있음을 보여줍니다. 이 모양 숨김에서 교대를 추출처럼
지금, 그것은 가능한 솔루션입니다 것으로 보인다. 예를 들어, 전환 번호가 (?<=pat1|pat2|pat3)
인 전환 표시는 (?:(?<=pat1)|(?<=pat2)|(?<=pat3))
으로 변환됩니다. 룩백 뒤에 |
이 없을 때까지 반복합니다. 아래에서 사용한 테스트 케이스에 대한 올바른 결과를 생성하는 것으로 보입니다.
이
"(?:^|(?<=,))(?:([^\",]+)|\"([^\"]*)\")(?:$|(?=,))"
그냥보기 미리에 문제가있는 경우에, 나는 또한 비 캡처로 교체 : 문제의 정규식에 대한 그래서
,이 해결 방법 (원래의 가정이 정확)입니다 결과는 같은 용도로 유지되므로 (테스트는 아직 버그가 있음을 보여 주지만, 경우에 따라 다름). 완전히 확신 할 수는 없지만 적어도
(?<=,)
및
(?=,)
에 대해 엔진이 올바르게 작동 할 수 있다고 생각합니다. 나는 또한 포획 그룹의 수를 줄이기 위해 자유를 취한다. 그래서 그들을 다시 말해봐.
-
부록 입력 문자열 ",abc,1234"
상기 정규식과 "(?<=^|[,.])"
"(?<!^|[,.])"
으로 시험 하였다. JRE 1.5u18과 JRE 1.6u32의 결과가 다릅니다.양수가이면 뒤 따르기 "(?<=^|[,.])"
의 경우 JRE 1.5u18의 출력에서 위치 1의 일치가 누락됩니다 (JRE 1.6u32의 출력과 비교). 대신, JRE 1.5u18의 경우 음수 look-behind "(?<!^|[,.])"
에 대한 결과에 위치 1이 표시되고 JRE 1.6u32의 출력에는 포함되지 않습니다.
그것은이 보완 행동을보고 놀라움의 대부분은 양극과 음극으로보기 숨김 서로 정반대이다, 아니다.
입력 문자열 ",abc,."
과 정규식 "(?<=,abc|[,.])"
을 사용한 다른 테스트입니다. 위치 1의 일치 항목은 JRE 1.5u18의 결과 목록에 표시되지 않으며 JRE 1.6u32와 비교됩니다.
교환 번호가 "(?<=[,.]|,abc)"
인 경우 JRE 1.5u18의 결과에서 위치 4의 일치 항목이 누락됩니다 (JRE 1.6u32와 비교).
는 다른 폭으로 제한하지만, 내가 테스트 한 경우가되지 않을 수 있습니다.
나는 문제의 정규식을 할 수는 (?<=(,|^))
에 (?<=(^|,))
을 변경, 즉 교대로 ^
및 ,
를 교환하여 입력 ",1234,ABC,\"sdfsdf,sdf\",sdfskhkf,"
에서 작동합니다.
왜 ','에 분할하지? – Srinivas
@Kedar : Java 1.5에 대한 지원을 중단해야한다고 생각합니다. 오라클은이를 사용하지 않을 것을 권장합니다. – nhahtdh