2012-06-07 3 views
5

이 정규식과 일치하는 문자열은 ^.+:[0-9]+(\.[0-9]+)*/[0-9]+$이며 쉽게 (Text):(Double)/(Int)으로 시각화 할 수 있습니다. 이 문자열을 세 부분으로 나누어야합니다. 일반적으로 이것은 (Text) 콜론을 포함 할 수 있다는 것을 제외하고는 쉬운 것입니다, 그래서 나는 어떤 결장에 분할 할 수없는 - 오히려 마지막 대장. 이미이 일을 꽤 깔끔한 작업을 수행하므로선택적으로 String.split()을 사용하여 마지막 구분 기호에서 문자열을 분할합니다.

.* 욕심이지만 사항 String.split에 정규 표현식 (등이 실 거예요 작업)은 구분 기호의 일환으로 내 (Text) 먹을 때문입니다. 이상적으로 나는 String []을 반환 할 무언가를 3 개의 문자열로 갖고 싶습니다. 나는 이것을 위해 String.split()을 사용하지 않고 100 % 괜찮습니다.

답변

3

정규식을 사용하면 어떨까요?

Pattern p = Pattern.compile("^(.*):([\\d\\.]+)/(\\d+)$"); 
Matcher m = p.matcher(someString); 
if (m.find()) { 
    m.group(1); // returns the text before the colon 
    m.group(2); // returns the double between the colon and the slash 
    m.group(3); // returns the integer after the slash 
} 

또는 이와 유사합니다. 패턴 ^(.*):([\d\.]+)/(\d+)$은 실제로 세 위치 모두에 값이 있다고 가정하고 두 위치에서 마침표/전체 정지를 허용하므로 사용자의 사양에 맞게 조정할 수 있습니다.

+0

방지하기 위해 필요한 느낌이 좋아, 이제 말을 대신 사용'[\ D \.] +' '\ d + (\. \ d +) *'를 필요로한다면 무엇을 할까? 그룹 0,1,3 만 안전하게 사용할 수 있을까? 즉,'sometext : other : 2/4 '와'sometext : other : 2.0/4' sill 그룹은 같은 방법으로 처리 할 수 ​​있습니까? – Huckle

+1

그룹 1, 2, 4가 될 수 있지만, 신경 쓰지 않아도됩니다. : \ d + (? : \. \ d +)? –

+0

그룹 (0)은 일치하는 문자열 전체를 반환합니다. 인덱스가 0에서 시작하지 않습니다. @AlanMoore는 엄격한 이중 정규식에 대한 좋은 제안을합니다. –

5

내가 정규식을 좋아하지 않아 (단지 내가 할 그러나 나는 그것을 아주 좋은 아니에요 농담).

String s = "asdf:1.0/1" 
String text = s.substring(0,s.lastIndexOf(":")); 
String doub = s.substring(s.lastIndexOf(":")+1,text.indexOf("/")); 
String inte = s.substring(text.indexOf("/")+1,s.length()); 
+0

당신의 문자열이 잘못되었습니다. 그것은 1 – Subs

+0

@Subs에서 인덱스 0하지에서 시작합니다. 나는 초기를 건너 뛰려면'(' – tskuzzy

+0

그는 시각화 목적을 위해'()'고 말했다 그 브래킷 – Subs

1

String.split()은 일반적으로 구분 기호와 서식이보다 일관되고 더 많은 요소를 분할하려고하는 경우 모르는 경우에 사용됩니다.

사용 사례는 평범한 구식 정규 표현식을 요구한다. 문자열의 형식을 알면 세 가지 값을 수집하려고합니다. 다음과 같이 해보십시오.

Pattern p = Pattern.compile("(.+):([0-9\\.]+)/([0-9]+)$"); 
Matcher m = p.matcher(myString); 
if (m.find()) { 
    String myText = m.group(1); 
    String myFloat = m.group(2); 
    String myInteger = m.group(3); 
} 
관련 문제