В вашем шаблоне так много неправильного:
/{2}?
: что, по вашему мнению, ?
означает здесь?Потому что, если вы думаете, что /{2}
необязательно, вы ошибаетесь.Вместо этого ?
является модификатором нежелания для повторения {2}
.Возможно, что-то вроде (?:/{2})?
- это то, что вы намереваетесь.
[\w+_*]
: что, по вашему мнению, +
и *
означает здесь?Потому что, если вы думаете, что они представляют повторение, вы ошибаетесь.Это определение класса символов, и +
и *
буквально означают символы +
и *
.Возможно, вы намерены ... на самом деле я не уверен, что вы намерены.
Попытка решения
Вот попытка угадать, что ваша спецификация:
String PART_REGEX =
"(word)(?:<<@(word) = (word)>>)?"
.replace("word", "\\w+")
.replace(" ", "\\s*")
.replace("<<", "\\(")
.replace(">>", "\\)");
Pattern entirePattern = Pattern.compile(
"(?://)?part(?:\\.{1,2}part)*"
.replace("part", PART_REGEX)
);
Pattern partPattern = Pattern.compile(PART_REGEX);
Затем мы можем проверить это следующим образом:
String[] tests = {
"item.sub_element.subsubelement(@key = string)",
"item..subsub_element(@key = string)",
"//subsub_element(@key = string)",
"item(@key = string)",
"one.dot",
"two..dots",
"three...dots",
"part1(@k1=v1)..part2(@k2=v2)",
"whatisthis(@k=v1=v2)",
"noslash",
"/oneslash",
"//twoslashes",
"///threeslashes",
"//multiple//double//slashes",
"//multiple..double..dots",
"..startingwithdots",
};
for (String test : tests) {
System.out.println("[ " + test + " ]");
if (entirePattern.matcher(test).matches()) {
Matcher part = partPattern.matcher(test);
while (part.find()) {
System.out.printf(" [%s](%s => %s)%n",
part.group(1),
part.group(2),
part.group(3)
);
}
}
}
Вышеуказанные отпечатки:
[ item.sub_element.subsubelement(@key = string) ]
[item](null => null)
[sub_element](null => null)
[subsubelement](key => string)
[ item..subsub_element(@key = string) ]
[item](null => null)
[subsub_element](key => string)
[ //subsub_element(@key = string) ]
[subsub_element](key => string)
[ item(@key = string) ]
[item](key => string)
[ one.dot ]
[one](null => null)
[dot](null => null)
[ two..dots ]
[two](null => null)
[dots](null => null)
[ three...dots ]
[ part1(@k1=v1)..part2(@k2=v2) ]
[part1](k1 => v1)
[part2](k2 => v2)
[ whatisthis(@k=v1=v2) ]
[ noslash ]
[noslash](null => null)
[ /oneslash ]
[ //twoslashes ]
[twoslashes](null => null)
[ ///threeslashes ]
[ //multiple//double//slashes ]
[ //multiple..double..dots ]
[multiple](null => null)
[double](null => null)
[dots](null => null)
[ ..startingwithdots ]
Вложения