私は現在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;
}
::)
問題は、少なくともJavaの正規表現エンジンは、キャプチャグループごとに複数の値を指定できない、つまり、\ [(g1)(g2)?(g3)?(g4 )?... \] 'を使用するか、複数の式を使用してパラメータを照合します(例:最初に入力からパラメータを抽出し、 'Matcher.find()'と一緒に2番目の式を適用して抽出します)。 – Thomas
'<' and '>'はJava正規表現では特別ではないので、バックスラッシュを前置する必要はありません –