2013-05-14 96 views
0

我有喜歡的字符串:劈裂的正則表達式或EBNF

create Person +fname : String, +lname: String, -age:int; 

是否有可能通過正則表達式或EBNF分裂呢?我的意思是所有的東西,如[a-zA-Z0-9](我們不知道的東西)將被存儲在數組中?

換句話說,通過使用該正則表達式:

^create [a-zA-Z][a-zA-Z0-9]* [s|b]?[+|[-]|=][a-zA-Z][a-zA-Z0-9]*[ ]?:[ ]?[a-zA-Z][a-zA-Z0-9]*(, [s|b]?[+|[-]|=][a-zA-Z][a-zA-Z0-9]*[ ]?:[ ]?[a-zA-Z][a-zA-Z0-9]*)*; 

欲獲得數組:

  • +
  • FNAME
  • 字符串
  • +
  • LNAME
  • 字符串
  • -
  • 年齡
  • INT

問候

+0

你可以給一個示例輸入行嗎? – Bill 2013-05-14 00:58:48

+0

示例輸入行是該字符串。 '創建Person + fname:String,+ lname:String,-age:int;' – Hladeo 2013-05-14 01:08:43

回答

0

你可以嘗試這樣

String[] tokens = "create Person +fname : String, +lname: String, -age:int;" 
     .split("[\\s:;,]+|(?<=[+\\-])"); 
     //split on set of characters containing spaces:;, OR after + or -. 
for (String s : tokens) 
    System.out.println("=> " + s); 

輸出拆呢:

=> create 
=> Person 
=> + 
=> fname 
=> String 
=> + 
=> lname 
=> String 
=> - 
=> age 
=> int 

正如你所看到的,它會把create放在你的數組的開始處,所以從tokens[1]開始迭代。

您可以嘗試添加^create\\s作爲拆分規則的一部分,但這會在tokens數組開始時產生空字符串,因此不會解決任何問題。

+0

我想知道是否有任何函數允許我通過regexp或ebnf「catch」結果,忽略像'create'這樣的常量字符。 – Hladeo 2013-05-14 01:28:44

+0

@Hladeo我不知道你在做什麼。如果有像'a bb x dd'這樣的模式,並且您只想查找可以說'a'和'c'的內容,則可以使用groups - > for regex「(\\ w +)bb(\\ w +)dd 「a」下的內容將存儲在組(1)和「c」組(2)中。 – Pshemo 2013-05-14 01:45:09

+0

@Hladeo你也可以刪除你想要忽略的第一個單詞,如'inputString.replaceAll(「\\ b(word1 | word2 | word3)\\ b」,「」)。split(「regexForSplit」) – Pshemo 2013-05-14 02:01:05

0

正則表達式適用於很多事情,但有時您需要一個真正的詞法分析器。 JFlex很棒。沒有它無法處理的標記化任務。如果您需要進一步研究並創建解析樹,則JavaCCANTLR是不錯的選擇。