2010-02-02 5 views
6

저는이 사람들로부터 좋은 웃음을 얻을 것이라고 확신하지만, 저의 삶에 대해 새로운 단락이 텍스트 문자열로 시작될 때를 나타내는 분리자를 찾을 수 없습니다. 단어와 줄? 쉬운 peasy하지만 단락을 찾는 것이 훨씬 더 어려워 보인다. 행간 두 줄의 줄 바꿈, 단락 나누기 및 줄 바꿈 유니 코드 표현을 사용해 보았습니다.Java로 단락을 분석하는 데 사용할 수있는 문자는 무엇입니까?

편집 : 내 원래 질문의 모호함에 사과드립니다. 몇 가지 질문에 답하기 위해 창에 원래 만들어진 기본 텍스트 파일입니다. 나는 RIM Eclipse 플러그인을 사용하여 Blackberry JDE 4.5로 내용을 열고 분석하기위한 코드를 테스트 중이다. 파일의 소스가 창 (적어도 가까운 미래에) 및 기본 텍스트 수 있지만, 나는 그들이 어떻게 만들어 지는지에 대한 통제권이 없다. (내가 만든 방법에 대한 액세스 권한이없는 제 3 자 소스이다.)

+0

이 문자에 대한 청중은 무엇인가? – bmargulies

+0

구문 분석하려는 텍스트의 모양은 무엇입니까? 여러 가지 방법으로 단락 나누기를 구성 할 수 있습니다. – jball

+0

나는 "나는 새 단락"이라는 문자열을 구분 기호로 사용하는 것을 좋아한다. 다른 물건을 방해하지 않는 것을 사용하십시오. –

답변

5

일반적인 사용에는 단락 기호가 없습니다.

행의 두 개 이상의 줄 바꿈 (가로 공백 (선택 사항) 사용)이 단락 나누기를 나타낼 수 있다고 생각하면 벗어날 수 있습니다. 그러나이 "규칙"에는 수많은 예외가 있습니다. 단락

  • 가 플로팅도에 의해 중단되는 경우, 또는 예를 들어,
  • 총알 점

포함하고이 같은 ...에서 계속된다. 그런 종류의 경우 아마도 해결책이 없을 것입니다.

EDIT @ Aiden의 의견에 따르면 (이제 OP와 관련이 없지만 Google을 통해 질문을 찾는 다른 사람들과 관련이있을 수 있음이 분명합니다.)

텍스트의 단락을 리버스 엔지니어링하는 대신, 귀하의 입력은 (예를 들어) Markdown 구문에 있어야합니다; 즉 StackOverflow에 의해 지원됩니다. Markdown Wiki에는 자바를 비롯한 여러 언어로 된 markdown 파서 구현에 대한 링크가 포함되어 있습니다.

+0

아마도 그는 기본적인 Java markdown 파서의 방향을 지적해야 할 필요가 있을까요? –

3

이 가능 대신 줄 바꿈에 당신이 CR LF를 찾을 필요가 (이렇게하면, 단락으로 분석하려고하는 등등. 텍스트의 입력 형식을 일부 제어 있다고 가정) 시퀀스 (\ r \ n) - 분명히 대답은 텍스트 형식에 따라 다릅니다.

2
String lineSeparator = System.getProperty("line.separator"); 

이렇게하면 플랫폼의 기본 행 구분 기호가 반환됩니다.

따라서, 예를 들어. 다음 작동합니다 :

String[] paragraphs = text.split(lineSeparator); 
+0

line.separator가 반드시 새 단락에만 사용되는 경우에만 작동하며, 반드시 그렇지는 않습니다. – sleske

+0

또한 텍스트를 생성하는 시스템이 코드를 실행하는 시스템과 동일한 구분 기호를 사용한다고 가정합니다. –

+0

완전히 맞습니다. OP는 기능 요구 사항과 실제 문제를 훨씬 더 명확하게해야합니다. 그러나이 대답을 제공하기에 충분할 정도로 모호한 질문이있었습니다. – BalusC

2

난 당신이 텍스트 파일이 아닌 MS-Word 또는 RTF 같은 복잡한 문서를 가정합니다.

텍스트 문서의 단락 개념은 잘 정의되어 있지 않습니다. 대부분의 경우 새 단락은 텍스트 편집기에서 문서를 열면 다음 줄에서 다음 텍스트 집합을 볼 수 있다는 사실에 의해 인식됩니다.

두 개의 특수 문자가 있습니다. new-line (LF-'\n') 및 캐리지 리턴 (CR-'\r')은 텍스트가 다음 줄에서 시작되도록합니다. 다음 행에 사용되는 문자는 사용하는 운영 체제에 따라 다릅니다.CRLF ('\r\n')처럼 둘 이상의 조합이 사용되는 경우도 있습니다.

자바에서는 System.getProperty("line.separator");을 사용하여 줄/단락을 구분하는 데 사용되는 문자 또는 문자 집합을 결정할 수 있습니다. 그러나 이것은 새로운 문제를 야기합니다. MS Windows에서 텍스트 파일을 만든 다음 Unix에서 열면 어떻게 될까요? 이 경우 텍스트 파일의 라인 seprator는 Windows의 라인이지만, java는 유닉스에서 실행 중입니다.

.

내 추천 :

텍스트 (docuemnt)의 길이 THEN 0이면 단락 = 0

텍스트 (docuemnt)의 길이 그리고,

    제로되지 않으면
  • '\n''\r'줄 으로 바꿔서으로 간주하십시오.
  • 텍스트 위의 줄 바꿈 문자를 검색하십시오.
  • 모든 연속 줄 바꿈 문자 은 하나 단락 기호으로 간주해야합니다. (1) + ( 문단 나누기의 카운트)

참고, 스티븐 가리키는 예외는 여전히뿐만 아니라 여기에 적용 = 단락의

  • 번호.

    . 일반 텍스트 문서

    public class ParagraphTest { 
    
        public static void main(String[] args) { 
         String document = 
            "Hello world.\n" + 
            "This is line 2.\n\r" + 
            "Line 3 here.\r" + 
            "Yet another line 4.\n\r\n\r" + 
            "Few more lines 5.\r"; 
         printParaCount(document); 
        } 
    
        public static void printParaCount(String document) { 
         String lineBreakCharacters = "\r\n"; 
         StringTokenizer st = new StringTokenizer(
            document, lineBreakCharacters); 
         System.out.println("ParaCount: " + st.countTokens()); 
        } 
    
    } 
    

    출력

    ParaCount: 5 
    
  • 3

    단락은 일반적으로 두 개 이상의 라인 분리에 의해 분리된다. 줄 구분 기호는 줄 바꿈 (\n), 캐리지 리턴 (\r) 또는 캐리지 리턴 다음에 줄 바꿈 (\r\n)을 사용할 수 있습니다. 이러한 세 가지 종류의 구분 기호는 일반적으로 운영 체제와 연결되지만 모든 응용 프로그램은 모든 종류의 줄 구분 기호를 사용하여 텍스트를 자유롭게 작성할 수 있습니다. 실제로 웹 페이지와 같이 다양한 소스에서 모아진 텍스트에는 두 가지 이상의 구분 기호가 포함될 수 있습니다. 응용 프로그램 텍스트를 읽는 경우 어떤 플랫폼에서 실행되던간에 항상 세 가지 종류의 줄 구분 기호를 확인해야합니다.

    BufferedReader#readLine() 그런데 물론 한 번에 한 줄만 읽습니다. 단순한 산문은 일반적으로 단락을 나타내는 비어 있지 않은 선과 그 사이의 공백을 나타내는 빈 줄의 교대 시퀀스로 반환됩니다. 그러나 그것에 의지하지 마십시오; 여러 개의 빈 줄을보아야하며 "빈"줄에는 실제로 공백 문자 (\u0020)와 TAB (\u0009)이 포함될 수 있습니다.

    BufferedReader으로 이동하지 않으려면 처음부터 감지 코드를 작성해야 할 수 있습니다. Java ME에는 정규 표현식 지원이 포함되어 있지 않으므로 split()java.util.Scanner을 사용할 수 없습니다. StringTokenizer는 returnDelims 옵션을 사용하지 않는 한 단일 구분 문자와 여러 문자를 구별하지 않습니다.그런 다음 구분 문자를 한 번에 한 문자 씩 반환하므로 어떤 유형의 구분 기호가 있는지 파악하기 위해 고유 한 코드를 작성해야합니다.

    2

    먼저, 가장 좋은 방법은 문단을 정의하는 것입니다. 줄 바꿈, 이중 줄 바꿈 또는 줄 바꿈, 탭 순서. 입력에 대한 제어권이없고 다양한 텍스트 샘플의 단락 수를 확인하려는 경우 이러한 상황이 발생할 수 있습니다. 또한 동일한 문서 내에서 동일한 목적으로 사용될 수도 있습니다. 따라서 일부 분석이 필요하며 항상 100 % 정확하지는 않습니다.

    • "\ r에"
    • "\ n \ r 일"
    • "\ n"
    • 은 System.getProperty ("line.seperator : 다양한 가능 문단 나누기를 초기화하여

      시작 ")

    및이 두 가지를 제외한 모든 유사 콘텐츠에는 끝에 탭 문자 ('\ t')가 추가됩니다.

    문자열로 입력을 넣은 다음 거기에 얼마나 많은 단락 결정 buffer.split().length를 호출하는 것이 작업을 수행하는 비효율적 인 방법. 효율적인 확장 가능한 방법은 단락이 시간을 고려하여, 주어진 "임계 값"아래에 그 단락을 던지는 스트림을 사용하여 입력을 통해 이동하는 것입니다. 더 진보 된 알고리즘은 심지어 그것이 (예를 들어, 몇 가지 매우 짧은 선 또는 몇 가지 매우 긴 사람을) 줄 바꿈 처리하는 방법으로 스위치를 발견 한 후 단락으로 간주 무엇을 전환 할 수 있습니다.

    그리고이 모든 것은 섹션 제목없이 서식없는 텍스트를 처리한다고 가정합니다. 특정 텍스트에 몇 개의 단락이 들어 있는지 묻는 개념은 몇 주를 물어 보는 것과 같습니다. 1 년. 정확하게 52는 아니지만 주변에 있습니다.

    관련 문제