2013-05-14 2 views
0

У меня есть строка, как:Spliting путем регулярных выражений или 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]*)*; 

Я хочу, чтобы получить массив:

  • Person
  • +
  • Fname
  • Строка
  • +
  • LNAME
  • Строка
  • -
  • возраст
  • INT

С уважением

+0

Можете ли вы привести пример ввода строки? – Bill

+0

пример ввод линия - это струна. 'create Person + fname: String, + lname: String, -age: int;' – Hladeo

ответ

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 как часть правила разделения, но это приведет к созданию пустой строки при запуске массива токенов, поэтому ничего не решит.

+0

Мне интересно, есть ли какая-либо функция, которая позволяет мне «ловить» результаты с помощью regexp или ebnf, игнорируя постоянные символы, такие как «create». – Hladeo

+0

@ Hladeo Я не уверен, что вы пытаетесь сделать. Если существует шаблон типа 'a bb x dd', и вы только хотите найти то, что находится внизу, скажем' a' и 'c', вы можете использовать группы -> для регулярного выражения" (\\ w +) bb (\\ w +) dd «то, что было под' a', будет храниться в группах (1) и 'c' (2). – Pshemo

+0

@ Hladeo вы также можете удалить первые слова, которые вы хотите игнорировать, прежде чем расщепляться, как 'inputString.replaceAll (" \\ b (word1 | word2 | word3) \\ b "," "). Split (" regexForSplit ")' – Pshemo

0

Regex отлично подходит для многих вещей, но иногда вам нужен настоящий лексер. JFlex отлично. Нет никакой задачи токенизации, с которой он не справится. Если вам нужно пойти немного дальше и создать дерево разбора, то JavaCC или ANTLR - хороший выбор.