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

配列を取得したい:

  • +
  • fname
  • +
  • 名前
  • -
  • 整数
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は素晴らしいです。処理できないトークン化タスクはありません。もう少し進んで解析ツリーを作成する必要がある場合は、JavaCCまたはANTLRが適しています。

于 2013-05-14T01:42:52.907 に答える