我的Java非常生疏,我試圖製作一個簡化shell腳本或批處理文件執行的用戶界面,這取決於它是分別是Linus還是Win32。這些文件具有以下命名約定。Java Shell通配符分詞器
module-verb-object-etc [args-list]
mysql-connect-grid
mysql-connect-rds
mysql-dump-grid
mysql-dump-grid-se314
最終我想它解析毫不含糊所以可以:
- 記號化的命令(例如,由分隔「 - 」)&縮短它們變成簡化術語soemthing像FoxPro的命令窗口或Cisco的IOS(例如,「我的公司」在unix中執行「mysql-connect-grid」和在win32中執行* .cmd)
- 並且還以IOS的風格允許用戶輸入縮寫命令,以便他們可以鍵入問題標記(?),它會給他們提示唯一的剩餘(或下一個)命令選項(例如「我的?「返回mysql &」my?「返回連接或轉儲)。對於不唯一或無法匹配的命令,Othr返回值將是「模糊的」或「未知的」。它可能看起來微不足道,但也有數百個命令中的每個文件夾中,我的用戶不想去思考...
我寫了一個函數來拉從一個目錄中的文件列表& retun數組fileanmes。然後,我使用下面的方法將其轉換爲2維數組,並返回動態大小的潛在命令網格。
/**********************************************************************************
* MAKE GRID: Parses array of filenames and tokenizes AWS cmds.
* @param strs Array of filenames
**********************************************************************************/
public static String [][] makeGrid(String strs[], boolean bPrint) {
String tmpGrid[][];
int nMaxCols = 0;
int nRows = uniqueCount(strs);
int nGridRow = 0;
tmpGrid = new String [nRows][];
for (int nRow=0; nRow<nRows; nRow++) {
String cFilename = strs[nRow];
if (!cFilename.endsWith(".cmd") // just list unix files (filter for batch files)
&& cFilename.indexOf("-") > 0) // make sure there's a dash in the filename
{
String strTokens[] = tokenize(strs[nRow], "-"); // the dash is our token deliminator
int nCols = strTokens.length;
if (nCols>nMaxCols) nMaxCols=nCols;
tmpGrid[nGridRow] = new String [nCols];
for (int nCol=0; nCol<nCols; nCol++) {
tmpGrid[nGridRow][nCol] = strTokens[nCol];
if (bPrint) System.out.print(" "+tmpGrid[nGridRow][nCol]);
}
nGridRow++;
if (bPrint) System.out.println("");
} //end-if
}
String[][] cmdGrid = new String[nGridRow][nMaxCols];
System.arraycopy(tmpGrid, 0, cmdGrid, 0, nGridRow); // removes null rows (&NPEs!)
return cmdGrid;
}
這將返回一個2-d陣列(下面),因此grid[Row-N][Col-0]
匹配。我想拉只不同的值,其中row[0]
是cmdToken[0] && row[1]
通配符匹配「像」 cmdToken[1]
讓我的用戶可以到"my du gr ?"
回報"ENTER, [se314]"
拼湊出一個命令 - 如果是有道理的......
String[][] makeGrid:
mysql dump grid se314
mysql connect grid
mysql dump grid
mysql connect rds
我的挑戰:我似乎無法在java中使用我的matcher函數。如果它是SQL它會是這樣的:
"SELECT DISTINCT col2 FROM cmd_Grid
WHERE col1 LIKE 'cmdToken1%' "
甚至更好:遞歸設置INT depthmark每次連續列
`SELECT DISTINCT col+str(depthmark+1) FROM cmd_Grid
WHERE col+str(depthmark) LIKE 'cmdMatchedTokens%' "
,直到你完全匹配。
我發現了一個名爲joSQL的包,我嘗試了絕望,但似乎無法讓它在Java6中工作。無論如何:我也希望有一個純粹的Java解決方案,以便一切都可以包含在一個類...
也許使用掃描儀或東西來解析我的multidimentional數組的唯一值...我知道我可能使它比它需要的更復雜。
在正確的方向溫和微調將不勝感激。
TIA
我不知道爲什麼它殺死了該方法的代碼......但是,我想這並不重要。我還沒有完全搞清楚下一部分,但可能傳遞給一個java.lang.ProcessBuilder函數來執行另一個獨立的Java程序或腳本或批處理文件 - 根據操作系統 – WWWIZARDS 2010-01-19 00:36:47