2014-04-12 3 views
1

문자열의 모든 단어의 시작 색인을 가져오고 싶습니다. 단어는 공백이 아닌 문자로 정의됩니다.모든 단어의 시작 색인

String test = "this that and that"; 
     Matcher matcher = Pattern.compile("\\s+[WHAT TO WRITE HERE]\\s+").matcher(test); 
     while (matcher.find()) { 
      System.out.println(matcher.start()); 
     } 

정규 표현식에는 무엇을 써야합니까? 예 : 출력은 0,5,10,14이어야합니다. 단어 사이에 공백이 여러 개있을 수 있습니다.

+6

왜 "\\ S +"'와 (과) 일치합니까? – fge

+0

답변으로 올리시겠습니까? 나는 그것을 받아 들일 것이다. 그러나 호기심에서 내가하는 방식대로 할 수있는 방법이 있습니까? –

+0

내 대답보기; 루프가 정확하고 의도 한대로 작동합니다. 문제 없습니다. – fge

답변

3

말씀이 무엇이든 비 공백 문자에 의해 정의된다.

그리고 문자 클래스는 \S입니다.

귀하의 정규식 따라서해야한다 :

private static final Pattern PATTERN = Pattern.compile("\\S+"); 

참고 그러나 "단어"당신이의 정의가 오히려 큰 것을; 또한 문장 부호 등이 포함됩니다.

일치하는 항목이있을 때 Matcher.start() 메서드는 실제로 일치 항목이 시작된 인덱스를 포함하므로 올바른 루프입니다.

코드를 촬영하고 그것을 조금 수정이 제공 :

String test = "this that and that"; 
Matcher matcher = PATTERN.matcher(test); 
while (matcher.find()) { 
    System.out.println(matcher.start()); 
} 
+0

하지만이 동물은 무엇입니까? –

+0

@CasimiretHippolyte 어떤 동물? 내 아바타? – fge

+0

예 <°)))))))))> –

1

나는이 정규식을 사용 :

... 
Matcher matcher = Pattern.compile("[^\\s]+").matcher(test); 
... 
1

내가 사용합니다 :

[A-Za-z0-9]+ 

그것은 영문자 및 ​​숫자, 단어를 찾을 수 있습니다. "\ S +"는 구두점과 이상한 문자가 문제가 될 것이라고 생각합니다. 원하는 경우 숫자 ("0-9") 부분을 삭제할 수도 있습니다.

1

@fge는 이미 가장 좋은 대답을주었습니다. 그러나 나는 그의 코멘트에 답할 수 없기 때문에. @Ian McGrath는 당신이 쓴 것이 무엇인지를 물으면서 다른 해결책이 존재합니다. 이것은 내가 생각해 내고 또한 작동하는 것처럼 보였습니다.

Matcher matcher = Pattern.compile("\\w+?(\\s+|$)").matcher(test); 
관련 문제