2017-06-17 81 views
1

編程相對比較新,所以我很抱歉,如果這是相當基本的。將字符串解析爲不同的變量類型

我想將字符串行轉換爲不同類型的實際變量。 我的輸入爲以下格式的文件:

double d1, d2 = 3.14, d3; 
int a, b = 17, c, g; 
global int gInt = 1; 
final int fInt = 2; 
String s1, s2 = "Still with me?", s3; 

這些線是在這一點上的所有字符串。我希望從字符串中提取變量並接收實際變量,以便我可以使用和操作它們。

到目前爲止,我試過使用正則表達式,但我在這裏磕磕絆絆。會喜歡一些方向,如何這是可能的。 我想使一個一般類型的格式例如:

public class IntType{ 
     boolean finalFlag; 
     boolean globalFlag; 
     String variableName; 

     IntType(String variableName, boolean finalFlag, boolean globalFlag){ 
     this.finalflag = finalFlag; 
     this.globalFlag = globalFlag; 
     this.variableName = variableName; 
     } 
} 

創建對於每個可變類型的新包裝。

通過使用和操縱我想然後比較我創建的包裝和檢查重複聲明等。

但我不知道我是否在正確的道路上。

注:不考慮壞的格式(即沒有「;」結尾等)

+0

我不會爲這類事情使用正則表達式,而是會使用專門爲此類工作構建的工具,我認爲您要查找的是詞法分析器,儘管我不確定我不做這項工作。雖然我**我確信,正則表達式不是要走的路。 –

+0

是否每個String行都遵循可重複的格式?如果是,哪一個?給出一個輸入樣本。否則,如何知道值是否必須分配給特定類型?例如double和int都可以適合'2'。 – davidxxx

+0

也許[ANTLR](http://www.antlr.org/)就是你要找的。再次,我不是這個領域的專家,這就是爲什麼我沒有發佈答案,而是發表評論。 –

回答

0

我對Java沒有經驗,但據我所知供應我來說,這是不可能的實際創建變量使用任何語言的文件。你會想創建某種列表對象,它可以容納可變數量的某種類型的項目。然後,您可以讀取文件中的值,將它們解析爲您想要的類型,然後將其保存到相應類型的列表中。

編輯:

如果我是你,我會改變我的文件佈局,如果可能的話。然後,它會是這個樣子:

1 2 3 4 //1 int, 2 floats, 3 booleans and 4 strings 
53 
3.14 
2.8272 
true 
false 
false 
#etc. 

在僞代碼,你會再閱讀如下:

string[] input = file.Readline().split(' '); // Read the first line and split on the space character 
int[] integers = new int[int.Parse(input[0])] // initialise an array with specefied elements 
// Make an array for floats and booleans and strings the same way 
while(not file.eof) // While you have not reached the end of the file 
{ 
    integers.insert(int.Parse(file.ReadLine())) // parse your values according to the size which was given on the first line of the file 
} 

如果你不能改變文件格式,那麼你就必須做一些智能字符串分割從文件中提取值,然後創建某種動態數組,當您爲其添加更多值時調整其大小。

多個編輯:基於您的評論

你一定想先在 '=' 字符分割。從分割的前半部分開始,您需要搜索一個類型,從下半部分開始,您可以再次分割','以查找所有值。

+0

這就是我在寫第二個代碼塊時所處的位置。但是,我不知道如何有效地提取名稱和值。 我以爲我可以使用正則表達式格式爲=#(somenumber) 假設這是一個int類型,我的模式是:[A-Za-z] +(\\ s)?=(\\ s) ?[0-9] + 但我不確定如何有效地使用它並從中提取值。 – YonMan

+0

不幸的是我不能改變格式。 我希望讀取代碼文件並檢查它們是否能夠正常運行。我無法更改代碼的輸入類型,因爲它不會運行。 – YonMan

1

雖然其他人說這不可能,但實際上是這樣。但是它深入到Java中。只需搜索java dynamic classloading。例如: Method to dynamically load java class files

它允許您在運行時動態加載java文件。然而當前輸入看起來並不像一個java文件,但它可以很容易地用小包裝類像包裹它轉換成一個:

public class CodeWrapper() { 
    // Insert code from file here 
} 

您可以方便文件或文本操作做到這一點加載的ressource前作爲班級。

後您已加載的類,你可以通過

Field[] fields = myClassObject.getClass().getFields(); 

這允許您訪問的可視性修飾符,該變量的類型,名稱,內容和更多通過reflection訪問它的變量,例如。

當然這種方法假設你的代碼實際上是有效的java代碼。 如果不是,並且您試圖確認它是否可用,則可以嘗試加載它。如果失敗,則無效。

+0

謝謝。我會馬上看看它。希望它會有所幫助。 – YonMan