Группы захвата печати шаблона Java
((\d{1,2})/(\d{1,2})/(\d{2,4}))
Есть ли способ получить список всех групп захвата с помощьюPattern
объект. Я отладил объект, и все, что он говорит, - это сколько групп (5).
Мне нужно получить список следующих групп захвата.
Пример вывода:
0 ((\d{1,2})/(\d{1,2})/(\d{2,4}))
1 (\d{2})/(\d{2})/(\d{4})
2 \d{2}
3 \d{2}
4 \d{4}
Обновить:
Я не обязательно спрашиваю, существует ли регулярное выражение, но это было бы наиболее благоприятным. До сих пор я создал элементарный синтаксический анализатор (я не проверяю большинство вне границ), который соответствует только самым внутренним группам. Я хотел бы знать, есть ли способ держать ссылку на уже посещенные скобки. Возможно, мне придется реализовать древовидную структуру?
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class App {
public final char S = '(';
public final char E = ')';
public final char X = '\\';
String errorMessage = "Malformed expression: ";
/**
* Actual Output:
* Groups: [(//), (\d{1,2}), (\d{1,2}), (\d{2,4})]
* Expected Output:
* Groups: [\\b((\\d{1,2})/(\\d{1,2})/(\\d{2,4}))\\b, ((\\d{1,2})/(\\d{1,2})/(\\d{2,4})), (\d{1,2}), (\d{1,2}), (\d{2,4})]
*/
public App() {
String expression = "\\b((\\d{1,2})/(\\d{1,2})/(\\d{2,4}))\\b";
String output = "";
if (isValidExpression(expression)) {
List groups = findGroups(expression);
output = "Groups: " + groups;
} else {
output = errorMessage;
}
System.out.println(output);
}
public List findGroups(String expression) {
List groups = new ArrayList();
int[] pos;
int start;
int end;
String sub;
boolean done = false;
while (expression.length() > 0 && !done) {
pos = scanString(expression);
start = pos[0];
end = pos[1];
if (start == -1 || end == -1) {
done = true;
continue;
}
sub = expression.substring(start, end);
expression = splice(expression, start, end);
groups.add(0, sub);
}
return groups;
}
public int[] scanString(String str) {
int[] range = new int[] { -1, -1 };
int min = 0;
int max = str.length() - 1;
int start = min;
int end = max;
char curr;
while (start -1 && end