2012-10-09 2 views
5

문제에 알맞은 정규식을 만들고 이상한 문제가 발생했습니다. Java Regex lookahead가 너무 많은 시간이 걸립니다.

나를 내가 할 노력하고있어 설명하자 ..

내 목표는 문자열의 양쪽 끝에서 쉼표를 제거하는 것입니다. E, g, 문자열 , ,, ,,, , , Hello, my lovely, world, ,, ,은 단지 Hello, my lovely, world이되어야합니다.

나는이 달성하기 위해 정규식에 따라 제조 한 다음을 찾을 (\w+,*? *?)+(?=(,?\W+$))

그것은 정규식 유효성 검사기의 매력처럼 작동하지만 안드로이드 기기에서 실행하기 위해 노력하고있어 때, matcher.find() 기능에 대한 응답 ~ 1 분을 적절한 일치 ... 나는 가정, 문제는 내가 사용하고 긍정적 예측에 있지만 그냥 처음부터 끝까지 별도로 쉼표를 트림보다 내가 더 나은 해결책을 찾을 수 없습니다 :

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning 
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end 

인가 거기에 뭔가 내가 긍정적 인 lookahead 내가 빠졌어요. n Java 정규식? 처음과 마지막에 쉼표 사이에서 문자열 섹션을 검색하려면 어떻게해야합니까?

답변

8

일치하는 그룹을 사용하는 경우 미리보기를 사용할 필요가 없습니다. 정규식 ^[\s,]*(.+?)[\s,]*$보십시오 :

편집 :이 떨어져, ^matches()를 사용하지만 다른 곳에서 유용 할 수 있습니다 경우 기술적으로 중복 라인의 시작과 일치 중단하십시오. [\s,]*은 0 개 이상의 공백 문자 또는 쉼표와 일치하지만 탐욕 스러울만큼 많은 문자를 허용합니다. (.+?)은 모든. 자열과 일!하지만 후미의 0 음표는 가능한 한 적은 수의. 자 (일치하지 않음)와 일치하도록 지시하고 내용을 첫 x 째 세트의} 호를 형성 할 때 "그룹 1"로 캡처합니다. 비 탐욕적인 일치는 최종 그룹에 동일한 0 이상의 쉼표 또는 공백 ([\s,]*)을 포함 할 수 있습니다. ^과 마찬가지로 에 유용하지만 matches()에는 중복됩니다.

공백 만 일치 시키려면 [\s,][ ,]으로 대체하십시오.

이 작동합니다!

Pattern pattern = Pattern.compile("^[\\s,]*(.+?)[\\s,]*$"); 
Matcher matcher = pattern.matcher(", ,, ,,, , , Hello, my lovely, world, ,, ,"); 
if (!matcher.matches()) 
    return null; 
return matcher.group(1); // "Hello, my lovely, world" 
+0

이샤 ... 내가 일치하는 그룹을 놓칠 수있는 방법 .. :(고마워요 내 정규식 지식을 브러시있어 ... –

관련 문제