2012-12-26 2 views
1

나는 그런문자열의 결과 목록에 분리 기호를 포함하여 "% * %"를 구분 기호로 사용하여 Java에서 문자열을 분할하는 방법은 무엇입니까?

자바
 INPUT      OUTPUT 
"hello %my% world" -> "hello ", "%my%", " world" 

으로 토큰 화 문자열의 간단한 방법을 찾고 있어요. 정규식으로 이것을 수행 할 수 있습니까? 나는 기본적으로 "% * %"형식의 구분 기호로 사용하는 String.split()을 찾고 있지만 무시하지는 않습니다. 일반적으로하는 것처럼 보입니다.

감사합니다.

+0

왜'%'에서 분할하지 않습니까? –

+0

설명이 불완전하거나 예제가 잘못되었다고 생각합니다. 그것을 수정할 수 있습니까? –

+0

@ BheshGurung : 나는 그것의 버그를 수정하겠습니다. –

답변

1

더 간단한 해결책은 문자열을 % 초로 분할하는 것입니다. 그런 식으로, 다른 모든 서브 시퀀스는 % s 사이에 있었을 것입니다. 이후에해야 할 일은 결과를 반복하고, 결과가 일반 문자열인지 알 수있는 플래그를 전환하거나 % 사이에있는 것입니다.

분할 구현에 특별한주의를 기울여야합니다. 빈 서브 시퀀스는 어떻게 처리됩니까? 일부 구현에서는 입력의 시작/끝에서 빈 하위 시퀀스를 삭제하기로 결정하고 나머지는 모든 빈 하위 시퀀스를 삭제하고 다른 하위 시퀀스는 삭제하지 않습니다.

%이 없어 졌으므로 정확한 결과가 나오지 않습니다. 그러나 실제 요구 사항이있을 경우 쉽게 다시 추가 할 수 있습니다 (나는 그렇지 않다고 추정합니다).

3

아니요, 설명해 준 방법대로 할 수 없습니다. 그 이유는 모호합니다! > "안녕하세요", "% 내 %가", "세계"

는 %가 그 전이나 문자열에 연결해야 -

"안녕 % 내 %의 세계"

당신은 예제를 제공합니다 그 후에?

출력은

이 "안녕하세요", "% 내", "%의 세계"

또는 아마도 출력이

"안녕하세요 %", "내 %"해야 할 경우, "world"

예제에서 이러한 규칙을 따르지 않습니다. 문자열 % 에 구분 기호를 붙이는 % my %가 나타나면 문자가 나타난 다음 문자가 나타나기 전에 문자가 나타납니다.

모호성이 있습니까?

따라서 먼저 delimeter를 부착 할 위치에 대한 명확한 규칙 세트를 제시해야합니다.

  • 이 규칙이 설정 따르는 일반적인 방법으로 문자열을 분할

    1. 사용 String.split() : 당신이 (문자열은 불변이기 때문에 비록 특히 효율적이지) 달성의 방법이, 하나의 간단한 작업을 수행하면 당신이 원하는 것은이다 구분 기호를 문자열에 있어야하는 위치에 다시 추가하십시오.
  • +0

    사실,하지만 이것은 대답이 아니며, 질문 –

    +0

    의 모호함을 비판하는 주석이어야합니다. 나는 처음에 대답 했었지만 그것을 편집했습니다 ... 나는 그것을 다시 추가했습니다. . – AFS

    +0

    ok, undownvoted : =) –

    0

    왜 단어 사이에 공백으로 나누지 않습니까? 이 경우 "hello", "% my %", "world"가 표시됩니다.

    0

    가능하면 더 간단한 구분 기호를 사용하십시오. 그리고 저는 배심원 단련 "%"를 구분 기호로 사용하여 괜찮습니다. 정규 표현식 대신 String.split()을 얻을 수 있습니다. 하지만 그럴 수 없다면 ...

    Regexps! Matcher을 사용하여이 구문을 분석 할 수 있습니다. 당신이 한 줄에 하나의 구분이 알고 있다면, 당신은 전체 라인 먹는 패턴 지정 입력이 긴 당신은 결과의 체인을해야하는 경우

    String singleDelimRegexp = "(.*)(%[^%]*%)(.*)"; 
        Pattern singleDelimPattern = Pattern.compile(singleDelimRegexp); 
        Matcher singleDelimMatcher = singleDelimPattern.matcher(input); 
    
        if (singleDelimMatcher.matches()) { 
         String before = singleDelimMatcher.group(1); 
         String delim = singleDelimMatcher.group(2); 
         String after = singleDelimMatcher.group(3); 
    
         System.out.println(before + "//" + delim + "//" + after); 
        } 
    

    을, 당신은 루프에서 Matcher를를 사용

    String multiDelimRegexp = "%[^%]*%"; 
        Pattern multiDelimPattern = Pattern.compile(multiDelimRegexp); 
        Matcher multiDelimMatcher = multiDelimPattern.matcher(input); 
    
        int lastEnd = 0; 
        while (multiDelimMatcher.find()) { 
         String data = input.substring(lastEnd, multiDelimMatcher.start()); 
         String delim = multiDelimMatcher.group(); 
         lastEnd = multiDelimMatcher.end(); 
         System.out.println(data); 
         System.out.println(delim); 
        } 
        String lastData = input.substring(lastEnd); 
        System.out.println(lastData); 
    

    데이터 구조에 이들을 추가하면 파싱 된 입력을 모두 빌드하게됩니다.

    입력시 실행 : http://ideone.com/s8FzeW

    관련 문제