0

我有一个像这样的字符串:

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]*)*;

我想获得数组:

  • +
  • 名称
  • 细绳
  • +
  • 名字
  • 细绳
  • -
  • 年龄
  • 整数
4

2 回答 2

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作为拆分规则的一部分,但这会在令牌数组的开头产生空字符串,因此不会解决任何问题。

于 2013-05-14T01:12:08.253 回答
0

正则表达式适用于很多事情,但有时您需要一个真正的词法分析器。JFlex很棒。没有它无法处理的标记化任务。如果您需要进一步创建解析树,JavaCCANTLR是不错的选择。

于 2013-05-14T01:42:52.907 回答