在常規使用只是像這樣的正則表達式,它似乎做什麼,我需要現在
List<String> extractTemplateVariables(String statement) {
Pattern pattern = Pattern.compile(/\$(\w*)\$/);
def List<String> runTimeParms = []
def matcher = pattern.matcher(statement)
while (matcher.find()) {
runTimeParms << matcher.group(1)
}
runTimeParms.removeAll(Collections.singleton(null));
runTimeParms.unique(false)
}
但有人告訴我正確的方法是檢查AST東西像這樣:
final int ID = 25
char delimiter = '$'
ST st = new org.stringtemplate.v4.ST(statement, delimiter, delimiter);
def dataFieldNames = []
def t = st.getAttributes()
st.impl.ast.getChildren().each {
if (it != null) {
CommonTree child = it as CommonTree
if (child.toString().equals("EXPR")) {
if (child.getChildCount() == 1) {
CommonTree expressionChild = child.getChild(0)
if (expressionChild.getToken().getType() == ID) {
dataFieldNames.add(expressionChild.toString())
} else if (expressionChild.toString().equals("PROP")) {
if (expressionChild.getChildCount() == 2) {
dataFieldNames.add(
expressionChild.getChild(0).toString() +
"." +
expressionChild.getChild(1).toString())
}
}
}
}
}
}
dataFieldNames.unique(false)
}
但我不明白結構或我在這裏做什麼,它沒有看到任何比第一個更多。也許有人可以幫助我們找出最好的辦法是什麼
你確定這是一個有效的'ST'?你可以使用它嗎? – 2014-10-29 10:54:33
是的,它是有效的ST。我可以使用add()來替換屬性值,但無法獲取屬性列表。 – user3751014 2014-10-29 10:57:51