2011-03-15 1 views
1

일반 텍스트 메시지 (HL7)에서 텍스트 서식을 처리하고 표시를 위해 다시 포맷합니다. 하나의 예는 \.sp5\입니다. 이것은 다섯 줄 바꿈을 의미합니다. 문자열 패턴을 N 번 찾아서 바꿉니다. 여기서 N은 패턴에 정의되어 있습니다.

그래서 나는 이런 식으로 뭔가를하고 싶은 것입니다 생각 해요 :

Pattern.compile("\\\.sp(\d+)\\").matcher(retval).replaceAll("\n{$1}"); 

내 IDE가 \d에서 잘못된 이스케이프 시퀀스가 ​​있음을 말해되고 완전히 대체 인수 할 것인지 확실하지 않다 내가 기대하는 것. 제 생각에 정규 표현식은 "backslash dot s p one-or-more-digits backslash"를 기술하고 있다고 말하면서 대체 단어가 "$ 1 줄 바꿈"이라고 말하고 싶습니다.

어떻게하면됩니까? 모든 슬래시 두 배로 할 필요 자바

Pattern verticalSpacesPattern = Pattern.compile("\\\\\\.sp(\\d+)\\\\", Pattern.MULTILINE); 
Matcher verticalSpacesMatcher = verticalSpacesPattern.matcher(retval); 

while (verticalSpacesMatcher.find()) { 
    int lineBreakCount = Integer.parseInt(verticalSpacesMatcher.group(1)); 
    String lineBreaks = StringUtils.repeat("\n", lineBreakCount); 
    String group = verticalSpacesMatcher.group(0); 
    retval = StringUtils.replace(retval, group, lineBreaks); 
} 

답변

1

사용이 : 당신은 정규식 방법을 사용할 수 없습니다

public static void main(String[] args) throws Exception { 
      // Create a pattern to match comments 
      Pattern p = 
       Pattern.compile("\\\\.sp(\\d+)", Pattern.MULTILINE); 

      // Get a Channel for the source file 
      File f = new File("Replacement.java"); 
      FileInputStream fis = new FileInputStream(f); 
      FileChannel fc = fis.getChannel(); 

      // Get a CharBuffer from the source file 
      ByteBuffer bb = 
       fc.map(FileChannel.MAP_RO, 0, (int)fc.size()); 
      Charset cs = Charset.forName("8859_1"); 
      CharsetDecoder cd = cs.newDecoder(); 
      CharBuffer cb = cd.decode(bb); 

      // Run some matches 
      Matcher m = p.matcher(cb); 
    int i = 0; 
    int n=0; 
      while (m.find()) 
       n= Integer.parseInt(m.group(1)); //first group,0, is the whole string , 1 is the subgroup 
    for(i=0;i<n;i++) 
       System.out.println("\n"); 
    } 
+0

문제를 처리하기위한 일반적인 패턴 때문에 허용됩니다. Dave DiFranco의 정규식을 사용해야했습니다. sol'n으로 편집 된 원본 게시물 – Freiheit

1

정규 표현식 :

이 솔루션은 아래 두 개의 덧글에서 조합이었다. "\"는 문자열의 특수 문자이기 때문에 여분의 슬래시로 이스케이프해야합니다. 그래서 당신은 아마 원하는 :

Pattern.compile("\\\\\\.sp(\\d+)\\\\").matcher(retval).replaceAll("\\n{$1}"); 
+1

처음에는 여전히 세 개의 백 슬래시가 누락되었습니다. 백 슬래시는 4 개, 점은 2 개가 있어야합니다. –

+0

네, 알란이 네 오른쪽이라고 생각해. 내 대답을 업데이트했습니다. 그 모든 역 슬래시는 나에게 두통을줍니다. –

0

합니다.

대신 일치하는 (\ d +) 번호를 .sp (\ d) + 대체를 수행하는 루프에 매핑해야합니다. 동적 구조를 사용하여 이러한 유형의 교체를 본 적이 없으며 정규 표현식 엔진이 문자열이 아닌 숫자인지 확인하기 위해 일치하는 그룹을 입력해야합니다.

그래서 번호를 검색하여 번호에 따라 대체 패턴 \n\n...\n을 만드는 것이 좋습니다. 그럼 대체 할 수있어.

1

백 슬래시를 이스케이프 처리하여 컴파일러에서 무시하지만 정규식 엔진에서이를 볼 수 있도록해야합니다.

자바 소스 코드에서 문자열 리터럴 내의 백 슬래시는 Java 언어 사양에서 유니 코드 이스케이프 또는 다른 문자 이스케이프 중 하나로 해석됩니다. 따라서 Java 바이트 코드 컴파일러에 의한 해석으로부터 보호하기 위해 정규 표현식을 나타내는 문자열 리터럴에서 백 슬래시를 두 번 사용해야합니다.

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

replaceAll() 부분 당신이 원하는 것을하지 것입니다 대체 텍스트 패턴의 그에 대한 규정이 없기 때문에 (대체 여러 번 반복). .group(1)으로 정수를 캡처하고 Integer.valueOf()으로 정수로 변환 한 다음 repeat 대체 텍스트를 해당 횟수만큼 변환해야합니다.

관련 문제