2013-02-07 2 views
3

나는 간단한 문자열을 가지고 있습니다. Ex. 1.0.0.2 및 분할하고 문자열의 일부만 검색하려면 : 출력 : 1.0.0 기본적으로 세 번째 뒤에 모든 텍스트를 제거하려면 .이 포함됩니다. split() 함수로 시도한 결과, .의 출현을 계산하고, 2보다 큰 경우 세 번째 점 indexOf()substring()을 얻습니다. 이를 달성하는 더 쉽고 빠른 방법이 있습니까? 어쩌면 regEx을 사용하고 있을까요?Regex와 indexOf를 사용하여 문자열 분할하기

편집 : 얼마나 많은 점들이 있을지 모르겠다.

+2

당신은 알고 있나요은 정확하게 3 개의 점이있을 것입니까? 그렇다면'lastIndexOf()'가 아마도'indexOf()'보다 도움이 될 것입니다. – ruakh

답변

4

정확히 3 점 — 그래서 당신은 여기에 lastIndexOf() —을 사용할 수 없습니다 정규식 기반의 솔루션입니다 :

final Matcher m = Pattern.compile("^[^.]*(?:[.][^.]*){0,2}").matcher(input); 
m.find(); // guaranteed to be true for this regex 
final String output = m.group(0); 
+1

그룹 (0)과 비 캡처 그룹의 멋진 사용을 위해 +1. 우아한. – pcalcao

+0

감사합니다. 정규 표현식의 문자 적 ​​의미를 설명 할 수 있습니까? 나는 그것을 이해한다 :'{0,2}'는 표현을 찾는 횟수를 의미한다. '^ [^.] *': 어떤 문자로 시작하지만. (그리고 그것은 성격의 별 열쇠입니다). 중간 그룹'(? : [.] [^.] *)'은? – StarsSky

+1

@StarsSky :'(? : ...)'는 그룹핑 구조이므로 마지막 {{.2}} 대신 {{0,2}}가'[.] [^.] *'전체에 적용됩니다. 부품. '[.]'는 "이 문자들 중 하나를 의미합니다 :'.'". ('.'은 문자 클래스 내에서 특별한 의미가 없다는 사실을 학대합니다. 그래서'[.]'는 이스케이프 (escaping) 방법입니다.'\\. '를 쓰는 것이 더 정확 합니다만, [[. ]'가 더 읽기 쉽도록). 그래서'(? : [.] [^.] *)'는 "도트 뒤에 0 개 이상의 도트가 아닌 문자가 오는"것을 의미합니다. – ruakh

3

substringlastIndexOf 만 사용하면 간단하고 빠릅니다. 나는 코드가 꽤 읽을 생각 : 당신이 정규식과 동일하게 달성 할 수 있지만

String str = "1.0.0.1"; 
String output = str.substring(0, str.lastIndexOf(".")); 

, 내가 귀찮게하지 것, 이해하기가 훨씬 더 많은, 자세한 어렵습니다 (이상 적어도 당신에게 시간이 걸립니다) 이것은 resonable 한 사이즈의 String을 위해 아주 빠릅니다.

편집 경우

당신이 모르는 얼마나 많은 점 당신의 String 더 복잡한 접근 방식이 필요하며이 경우, 정규식은 잘 할 것, + ruakh의 대답은 확실히 트릭을 수행해야합니다 훌륭하게.

가독성 (가독성은 정규식 주위의 혼란에 따라 다르다)을 선호하는 경우, 문자열에있는 문자의 발생 횟수를 계산하는 보조 방법을 만들 수 있으며이를 사용하여 잘라야하는지 결정할 수 있습니다 그것 또는 아닙니다. 당신이있을 것이라는 점을 확실히 알 수없는 경우

+0

+1 나를 때려 눕히고 심지어 좋은 설명과 _why_ 정규 표현식에 대한 설명이 과장 될 것입니다. 좋은! –

+0

페이지가 새로 고쳐지는 것이 행운이라는 질문 일뿐입니다. – pcalcao

+0

IMHO 정규식이 필요합니다. 얼마나 많은 점들이 있는지 알 수 없기 때문입니다. 이것은 3 개의 점이있는 경우에만 작동하며, 더 많거나 적은 점이 있으면 세 번째 점 (이후)의 입력을 자르지 않습니다. – jlordo

1
String input = "1.0.0.2"; 
String output = input.substring(0, input.lastIndexOf("."));