2014-12-11 3 views
0

"split"메서드를 사용하는 대신 다음 문자열에서 큰 따옴표 문자 ("")의 모든 색인 값을 가져 오는 쉬운 방법이 있습니까? 감사.Java 문자열 여러 색인 값 가져 오기

String command = "-u User -P Password mkdir \"temp dir\" rmdir \"host dir\""; 
int[] indexAll = command.indexOf ("\""); // This line of code is not compile, only I expect this kind of expression 

답변

3

내장 된 방법이 없습니다.

시작 위치를 허용하는 오버로드 된 String#indexOf(String, int) 메서드를 사용하십시오. -1이 될 때까지 루핑을 계속하고 항상 이전 호출의 결과를 시작 위치로 제공합니다. 각 결과를 List에 추가하고 나중에 int[]으로 변환 할 수 있습니다.

또는 PatternMatcher을 사용하고 반복하면 Matcher#find()이 결과를 반환합니다. 여기

은 몇 가지 예입니다 :

public static void main(String[] args) { 
    String command = "-u User -P Password mkdir \"temp dir\" rmdir \"host dir\""; 
    List<Integer> positions = new LinkedList<>(); 
    int position = command.indexOf("\"", 0); 

    while (position != -1) { 
     positions.add(position); 
     position = command.indexOf("\"", position + 1); 
    } 
    System.out.println(positions); 

    Pattern pattern = Pattern.compile("\""); 
    Matcher matcher = pattern.matcher(command); 
    positions = new LinkedList<>(); 

    while (matcher.find()) { 
     positions.add(matcher.start()); 
    } 

    System.out.println(positions); 
} 

인쇄이 소티 리오스 방법과 유사하다

[26, 35, 43, 52] 
[26, 35, 43, 52] 
1

,하지만 당신은 사건의 처음 발견 번호, 배열로 다시 변환 피할 수 있도록 배열을 초기화 할 수 있습니다.

String command = "-u User -P Password mkdir \"temp dir\" rmdir \"host dir\""; 
int count = command.length() - command.replace("\"", "").length(); 
int indexAll[] = new int[count]; 
int position = 0; 
for(int i = 0; i < count; i++) { 
    position = command.indexOf("\"", position + 1); 
    indexAll[i] = position; 
} 
+0

은 동일하게 작동하지만 난 INT는 [] = 새로운 INT [StringUtils.countMatches (명령, "\" ")] indexAll', StringUtils.countMatches' 은 깔끔'사용하여 생각,'하지만 그건 그냥 취향입니다. https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#countMatches(java.lang.String,%20java.lang.String) –