2012-12-14 80 views
1

使用Scanner類從開始/中間程序員的控制檯讀取輸入的替代方法有哪些?用於控制檯輸入的Java的掃描儀類的替代方案

我開始看昨天,谷歌帶我到一些關於自然語言處理和一些自然語言處理工具包列表的文章。我發現的列表沒有很好地註釋,並且主題非常快速。

我問,因爲我開始想要製作一個自定義的分隔符列表,例如「+」| 「 - 」| 「*」| 「/」。這似乎不可能使用掃描儀。

+0

你打算創建一個自定義列表分隔符或它們的自定義*組合*因爲Scanner允許你指定你自己的分隔符模式。但是這聽起來像你想要分隔符是上下文敏感的? – Perception

+0

不確定你真正想要什麼,但是你可以使用正則表達式,indexOf(),tokenizer等來分割字符串。 – PhiLho

+0

@Perception - 是的,上下文相關,這樣如果有人輸入一個簡單的數學表達式,如「3 + 5 「或」4 * 2「,我可以使用掃描儀(或其他)解析它。 –

回答

4

我開始懷疑有關使分隔符的自定義列表,如 「+」 | 「 - 」| 「*」| 「/」。這似乎不可能使用掃描儀。

你想達到這樣的目的嗎?

String text="Some text +with -delimiters *described /above"; 
Scanner in=new Scanner(text); 
in.useDelimiter("\\+|\\-|\\*|/"); // +,-,* are metacharacters in regex 
            // to escape its special meaning we need 
            // to use "\\" before each of them 
int counter=0; 
while(in.hasNext()) 
    System.out.println(counter++ +") "+ in.next()); 

輸出

0) Some text 
1) with 
2) delimiters 
3) described 
4) above 
+0

是的,那正是我想要做的。因此,您不必在useDelimiter()參數中包含任何內容,以指示除了列出的內容外,您還希望它繼續使用空格? –

+1

@e。inglewood不確定你的意思是「繼續使用空格」。要在分隔符中包含空格,你可以在'\\ s *(\\ + | \\ - | \\ *//)\\ s *'(*表示0或更多的元素在它之前) – Pshemo

+0

解決了這個問題。非常感謝你。 –

1

你可以用BufferedReaders和InputStreams來完成。

BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));

2

這聽起來像你正在寫一個解釋,並要評估你在通過表情。

我的建議是看Flex,這將對您的輸入進行詞法分析並將其轉化爲令牌。然後看看Gnu Bison,它將採用該標記集,並將它們解析爲表達式樹。

Flex和Bison將在您的程序內部有效地創建一個「迷你編譯器」,並用它來分析輸入,但是這將使您能夠比使用Scanner更好地處理上下文敏感的事情。

TL; DR

軟硬度:字符串 - >令牌

野牛:令牌 - >表達式樹

您:表達式樹 - >魔術

+0

謝謝。我會看看這兩個。 –