編集:解決策を見つけました-
/**
* Returns the arguments of the method. Ensures inner methods are intact.
*
* @param fullMethod full method string
* @return arguments of the method
*/
public static String[] getArguments(String fullMethod) {
String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
List list = new List();
int count = 0;
int lastComma = 0;
for (int x = 0; x < innerFirstBrackets.length(); x++) {
if (innerFirstBrackets.charAt(x) == '(') {
count ++;
} else if (innerFirstBrackets.charAt(x) == ')') {
count --;
}
if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
if (count == 0) {
list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
(x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
lastComma = x;
}
}
}
return list.getItems();
} else {
// No inner methods
return innerFirstBrackets.split(",");
}
}
String
メソッドの表現内で引数を取得しようとしています。これまでのところ、ほとんどの場合に成功していますが、特定のケースでは機能しません。
これが私が現在持っているコードです:
/**
* Returns the arguments of the method. Ensures inner methods are intact.
*
* @param fullMethod full method string
* @return arguments of the method
*/
public static String[] getArguments(String fullMethod) {
String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
List list = new List();
boolean first = false, second = false;
int lastComma = 0;
for (int x = 0; x < innerFirstBrackets.length(); x++) {
if (innerFirstBrackets.charAt(x) == '(') {
first = !second;
} else if (innerFirstBrackets.charAt(x) == ')') {
second = true;
}
if (first && second) {
first = second = false;
}
if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
if (!first) {
list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
(x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
lastComma = x;
}
}
}
return list.getItems();
} else {
// No inner methods
return innerFirstBrackets.split(",");
}
}
これは、引数としてメソッドがある場合に機能しますが、引数としてメソッドを持つ複数の引数がある場合には機能しません。これはよくあることではありませんが、コードに脆弱性があるのは好きではありません。
うまくいく方法の例
get(get(1,2));
また
get(get(get(get(1,2))));
また
get(get(1),get(1));
しかし、このようなものが与えられるとうまくいきません
get(get(get(1)),get(1));
次のかっこを見つけるだけでなく、姉妹のかっこを見つける方法がわかりません。(姉妹括弧の意味がわからない場合は、ほとんどの IDE で、一方の括弧を強調表示すると、もう一方の括弧が自動的に強調表示されることを考えてみてください。EX.