【问题标题】:Splitting by regex or ebnf通过正则表达式或 ebnf 拆分
【发布时间】:2013-05-14 00:57:24
【问题描述】:

我有一个类似的字符串:

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
  • 字符串
  • +
  • 名字
  • 字符串
  • -
  • 年龄
  • int

【问题讨论】:

  • 你能举一个输入行的例子吗?
  • 示例输入行就是那个字符串。 create Person +fname : String, +lname: String, -age:int;

标签: java regex ebnf


【解决方案1】:

你可以试试这样拆分

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

【讨论】:

  • 我想知道是否有任何函数可以让我通过 regexp 或 ebnf “捕捉”结果,而忽略像 create 这样的常量字符。
  • @Hladeo 我不确定您要做什么。如果有像a bb x dd 这样的模式,而您只想找到下面的内容,比如说ac,您可以使用组-> 正则表达式 "(\\w+) bb (\\w+) dd" 是什么a 下将存储在 group(1) 和 c group(2) 中。
  • @Hladeo 您还可以在拆分之前删除要忽略的第一个单词,例如inputString.replaceAll("\\b(word1|word2|word3)\\b","").split("regexForSplit")
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多