2017-04-18 9 views
2

(전후) 주위 대문자로 문자를 대체자바 I 입력의 종류가 특정 문자

나는 단어의 시작에서와 바로 ' 문자 다음 문자를 모두 대문자로 변환 할 필요가
word w'ord wo'rd 

(여러 번 존재할 수 있음).

(앞의 예를 사용하여) 내가 필요로하는 출력은

word W'Ord Wo'Rd 

나는 간단한 패턴

s.replaceAll("(\\w)(\\w*)'(\\w)", "$1"); 

과 노력하지만 대문자

에 그룹 1과 3을 변환 할 수 없어요

편집 : 주된 질문에서 약간의 실수를 발견 한 후에 @ Wiktor Stribizew 코드를 편집하여 놓친 사례를 포함 시켰습니다.

Matcher m = Pattern.compile("(\\w)(\\w*)'(\\w)").matcher(s); 
StringBuffer result = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2) + "'" + m.group(3).toUpperCase()); 
} 
m.appendTail(result); 
s = result.toString(); 

답변

9

일치 항목을 처리하려면 Java에서 Matcher#appendReplacement을 사용해야합니다. 한 단어의 문자 : - - 선도적 인 단어 경계

  • (\w) 그룹 1

    • \b :

      String s = "word w'ord wo'rd"; 
      StringBuffer result = new StringBuffer(); 
      Matcher m = Pattern.compile("\\b(\\w)(\\w*)'(\\w(?:'\\w)*)").matcher(s); 
      while (m.find()) { 
          m.appendReplacement(result, 
           m.group(1).toUpperCase()+m.group(2) + "'" + m.group(3).toUpperCase()); 
      } 
      m.appendTail(result); 
      System.out.println(result.toString()); 
      // => word W'Ord Wo'Rd 
      

      Java demo

      패턴 브레이크 다운를 참조하십시오 예를 들면 :

    • (\w*) - 그룹 2 : 0 개 이상의 단어 문자
    • ' - 작은 따옴표
    • (\w(?:'\w)*) - 그룹 3 :
      • \w - 워드 문자
      • (?:'\w)* - 0 개 이상의 시퀀스 :
        • ' - 작은 따옴표
        • \w - 단어 char. 당신이 패턴이 더 정확한 만들고 싶어
    • 이제

    , 당신은 \p{Ll}와 소문자와 일치하도록되어있는 \w\p{L}있는 모든 문자와 일치하는 가정되는 \w을 변경할 수 있습니다 . 패턴은 "(?U)\\b(\\p{Ll})(\\p{L}*)'(\\p{Ll}(?:'\\p{Ll})*)"처럼 보일 것입니다. 그러나 소문자 앞에 대문자가있는 경우 (예 : wo'r'D's ->Wo'R'D's) 소문자 (예 : ' 이후)로 글자를 남겨 둘 위험이 있습니다. (?U)Pattern.UNICODE_CHARACTER_CLASS 인라인 한정자이므로 \b 워드 경계를 유니 코드 인식합니다[email protected] Stribizew의 위의 포스트하지만 정규식없이 할 수있는 시도로 우아하지

  • +0

    . 이 코드를 실행하고 변환해야하는 모든 행의 출력을 보면, 주된 질문에서 약간의 실수를 발견했습니다. 나는 이제 내가 놓친 경우를 포함시키기 위해 주요 질문을 조정했다 –

    +0

    문자열에 실패 : \t String s = "wo'rd w'ord wo'r'd"; – Optional

    +0

    @DevilingMaster : 동일한 접근법이 여기 유효합니다 : 필요한 것을 그룹으로 캡처 한 다음, 필요한 동안 각 그룹을 'while'블록 내에서 조작하십시오. –

    0

    이 실제로 작동

    public class HelloWorld{ 
    
    public static void main(String []args){ 
        String s ="word w'ord wo'r'd"; 
        System.out.println(upperCase(s,'\'')); 
    } 
    private static int x = 1; 
    private static String upperCase(String originalString, char delimeter) 
    { 
        if(originalString.length()==1) 
        { 
         return originalString; 
        } 
        int indexOfDelimeter = originalString.indexOf(delimeter); 
        StringBuilder result = new StringBuilder(); 
        if(indexOfDelimeter<0) 
        { 
         return originalString; 
        } 
        String newBaseString = originalString.substring(indexOfDelimeter+2); 
        if(indexOfDelimeter==0) 
        { 
         result.append(delimeter).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter+1))).append(newBaseString); 
        } 
        else 
        { 
         result.append(originalString.substring(0,indexOfDelimeter-1)).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter-1))).append(delimeter).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter+1))); 
        } 
        if(indexOfDelimeter<originalString.length()) 
        { 
         result.append(upperCase(newBaseString,delimeter)); 
        } 
        return result.toString(); 
    } 
    }