2014-07-25 19 views
0

我試圖來標記輸入到程序的東西,如下列:最佳方式來標記輸入

create table users schema {firstName: string, lastName: string, age:number, address: string} 
insert on users values {firstName: foo, lastName: bar, age:1, address: 32 foobar street} 

我想要的標記出來,如下:

Token 1: insert 
Token 2: on 
Token 3: users 
Token 4: values 
Token 5: {firstName: foo, lastName: bar, age:1, address: 32 foobar street} 

它是我嘗試使用的SQL類語法。正則表達式是最好的方式,還是有其他的東西?

+0

對我來說,我會建議正則表達式。儘管我只知道一點java,所以可能會有更好的東西。 – user3003304

+0

爲什麼令牌5'{firstName:foo,lastName:bar,age:1,address:32 foobar street}''?難道它不像'Token 5:'{',Token 6:firstName,Token 7:':',...''? – Jashaszun

+0

另外'create table'行發生了什麼?爲什麼它不包含在令牌中? – Jashaszun

回答

0

此正則表達式

^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\{.*\}).*$ 

作品的兩個給定的輸入,但幾乎肯定會失敗的投入,其(未申報的合題)語法是有效的。

如果你願意接受的輸入語法上的些許變化,你可能要考慮使用JSON(和使用Java的語法分析器吧,傑克遜:https://github.com/FasterXML/jackson

1

我認爲最好的方式來處理這個特殊的問題是在循環中使用正則表達式。

Pattern pat = Pattern.compile("\\{.*?\\}|[^ \\{]+"); 
Matcher m = pat.matcher(source); 
while (m.find()) { 
    String token = m.group(0); 
    // add to an ArrayList or whatever 
} 

模式查找或者:

  • 左大括號,其次是什麼,其次是右大括號。 (A反斜槓已到括號之前,因爲否則它們具有特殊的含義的情況下被插入。.*?意味着匹配零個或多個字符,並具有?含義儘可能少有在輸入多}

  • 任何序列文字不爲空或{

循環會發現在每個這種令牌; m.group(0)返回被匹配的字符串

使用正則表達式一個讓人難以返回AV不計其數的令牌。使用split通常是將字符串拆分爲多個令牌的好方法,但這種情況有點太複雜,無法找出正確的分隔符。 (我相信這是可行的,但會讓你的代碼更難理解。)

我已經測試過你提供的兩個輸入樣本,我認爲它提供了你想要的結果。