2017-03-29 9 views
2

私は現在regexとstruggelでいくつかの作業をしています。RegexはJavaでオプションのエントリを見つける

私はそのために、私はいくつかのプリセットをロードする必要があり、いくつかのスクリプトエンジンを構築したい:

例:

create <Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>] : Creator 
edit <Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>] 
run [<File>, <Command>] 

をだから私は、私は<Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>][<File>, <Command>]を読むことができることを確認します。理解のために

NAME <IMPORTANT_PARAMETER> [TEXT_PARAMETER(AMOUNT_OF_OPTIONAL_PAREMETER);<OPTIONAL_PARAMETER(S)>]

この例では、「コマンド名」をIMPORTANT_PARAMETERとして使用しました。

私はこの正規表現を作った最初のルールの場合:\<(\w+)\>(?:\s+\[(?:(.*;))(.*)\])?(?:\s+\:\s+(\w+))?、それはちょっと私のコード内で動作します:

Pattern p = Pattern.compile("\\<(\\w+)\\>(?:\\s+\\[(?:(.*;))(.*)\\])?(?:\\s+\\:\\s+(\\w+))?"); 
Matcher m = p.matcher(parameters); 
if(m.matches()){ 
    Command command2 = new Command(command); 
    command2.addParameter(new Parameter(m.group(1))); 

    String text = m.group(2); 
    String[] texts = null; 
    if(text != null){ 
     texts = text.split(";"); 
     command2.addTexts(Arrays.asList(texts)); 
    } 
    String type = m.group(3); 
    String[] types = null; 
    if(type != null){ 
     types = type.split(", "); 
     for (String string : types) { 
      Pattern pTypes = Pattern.compile("\\<(?:(\\w+))\\>"); 
      Matcher mTypes = pTypes.matcher(string); 
      if(mTypes.matches()){ 
       command2.addParameter(new Parameter(mTypes.group(1), true)); 
      } 
     } 
    } 
    String className = m.group(4); 
    if(className != null){ 
     command2.addClassName(className); 
    } 
    commandslist.add(command2); 
} 

私は\[\<(\w+)\>(?:,\s+\<(\w+)\>)+\]を使用しようとしましたが、それは唯一の2つのエントリのために働いていた - >例run [<File>, <Command>]。これらのオプション要素の「リスト」を持つ方が良いでしょう[<File>, <Command>]。ですから、最後にはm.group(1) = File; m.group(2) = Command; m.group(3) = blablabla;などを持ちたいと思います。

私はあなたに十分な問題を見せてくれることを願っています。説明が必要なものがあれば質問してください。

public static void main (String[] args) { 
    final String STR1 = "run [<File>, <Command1>, <Command2>, <Command3>]"; 
    final String STR2 = "run [<File>, <Command1>, <Command2>, <Command3>, <Command4>]"; 

    System.out.println(parse(STR1)); 
    System.out.println(parse(STR2)); 
} 

private static List parse(String str) { 
    List<String> list = new ArrayList<>(); 

    Pattern p = Pattern.compile("(?:\\G,\\s+|^run\\s+\\[(?:<\\w+>,\\s+)+?)<(\\w+)>"); 
    Matcher m = p.matcher(str); 
    while (m.find()) { 
     list.add(m.group(1)); 
    } 

    return list; 
} 

::)

+2

問題は、少なくともJavaの正規表現エンジンは、キャプチャグループごとに複数の値を指定できない、つまり、\ [(g1)(g2)?(g3)?(g4 )?... \] 'を使用するか、複数の式を使用してパラメータを照合します(例:最初に入力からパラメータを抽出し、 'Matcher.find()'と一緒に2番目の式を適用して抽出します)。 – Thomas

+3

'<' and '>'はJava正規表現では特別ではないので、バックスラッシュを前置する必要はありません –

答えて

0

My suggestionを支援するためのおかげで後にあなたが単語の間のものと一致することですREGEX101

REGEXRまたはregex101:ここ

regexrへのリンクです結果は次のようになります。

[Command1, Command2, Command3] 
[Command1, Command2, Command3, Command4] 
関連する問題