2017-11-24 10 views
0

없이 문자열을 얻을 추적 할 수없는 가망입니다 File.ReadAllLines 사용 :F # - 문제는 내가 같은 문자열이 있다는 것입니다 어떻게 새로운 라인

: 나는 같은 문자열 목록을 가져하려고하면

public class MyFirstJavaProgram { 

    public static void main (String []args) { 
     System.out.println ("Hello World"); 
    } 
} 

["public";"class";"MyFirstJavaProgram";...;"(";""Hello World"";")";"...] 

임 내가 그 공백을 제거하는 방법

["public class MyFirstJavaProgram {"; ""; 
" public static void main (String []args) {"; 
"  System.out.println("Hello World"); "; " }"; "}"] 

를 받고.

+0

'trim'을 사용하여 공백을 제거합니다. –

+1

예상되는 출력에서 ​​분리 된 요소로 "public"및 "class"를 예상했지만 "Hello World"는 함께 표시됩니다. 이걸 확장 할 수 있을까요? 따옴표 때문인가요? 전체 출력을 지정할 수 있습니까? – Gustavo

+0

F # 형식을 사용하여 문자열 목록의 토큰을 만들려고했지만 Im 대신 fsyacc 및 fslex를 사용한다고 생각합니다. 그리고 토큰 중 일부는 문자열입니다. –

답변

0

일부 라인에 관심이없는 경우, 이동하는 방법은 filter입니다 : 다음

File.ReadAllLines(...) 
|> Seq.filter (not << String.IsNullOrWhitespace) 

, 모든 라인을 분할 할 수 있습니다 :

|> Seq.collect (fun line -> line.Split([| " " |], StringSplitOptions.RemoveEmptyEntries)) 

RemoveEmptyEntries 빈 줄을 제거하고 선도하는 것/후행 공백. 그래서 filter ing는 더 이상 필요하지 않으며 어떤 것도 trim ming이 필요하지 않습니다.

예를 들어 자바 토큰 화 프로그램이 아닙니다. main(main(으로 분할되지 않지만 "Hello World""HelloWorld"으로 분할됩니다.

적절한 Java 구문 분석을 수행하려면 라이브러리를 찾으십시오.
라이브러리 요청 및 추천은 StackOverflow에서 적절하지 않습니다. SoftwareRecommendations이 도움이 될 수 있습니다. 원래 문제의 샘플 출력을 감안할 때

+0

@AdamHouldsworth 감사합니다, 내 대답을 명확히 – CaringDev

+0

사실 나는 틀렸어, 나는 OP가 그들이 다른 구조가 분리되기를 원하는 것이라고 암시한다고 생각한다. –

0

, 나는 가장 가까운 간단한 해결책이 될 것이라고 생각 :

File.ReadAllText("MyFirstJavaProgram.java").Split([|' '; '\n'|], StringSplitOptions.RemoveEmptyEntries) 
|> Array.map (fun s -> s.Trim()) 

그러나,이 배열의 한 항목으로 문자열에 "Hello World"를 취급하지 않습니다. 이를 위해서는 적절한 토큰 화 알고리즘을 사용해야합니다.