如何制作一个正则表达式来匹配字符输入和方法并调用它?

时间:2018-10-17 06:50:43

标签: java regex

假设我有这样的方法-

void a(){
//Some statements here
}
void b(){
//Some statements here
}
void c(){
//some statements here
}

我正在接受这样的输入-

Scanner sc = new Scanner(System.in);
String name = sc.next();

如果输入是“ ac”,那么我该如何分隔输入并通过正则表达式调用a()和c()方法?

2 个答案:

答案 0 :(得分:1)

您可以在此处使用switch语句:

Scanner sc = new Scanner(System.in);
String name = sc.next();
String[] methods = name.split("\\|");

for (String method : methods) {
    switch(method) {
        case "a":
            a();
            break;

        case "c":
            c();
            break;

        default:
            System.out.println("No method " + method + "() is known to exist");
            break;
    }
}

我在这里进行了一项重大的设计更改。我假设您将输入的方法名称以竖线分隔。例如,如果要按此顺序呼叫a()c(),则可以在扫描仪中输入a|c。据我所知,Java方法名称中不允许使用管道|,因此它是分隔符的理想选择。

可能存在一种尝试使用字符串名称直接调用方法的方法,例如使用反射,但随后我们将不得不担心可能不存在的方法。上面的case语句避免了这种情况的发生。

答案 1 :(得分:1)

我认为Tim Biegeleisen的答案解决了这个问题。这是一种可能有用的替代解决方案。

import java.util.HashMap;
import java.util.Map;

public class FunctionMap {


    public static void main(String[] args) {
        Map<Character, java.lang.Runnable> methodMap = new HashMap<>();

        //If methods are similar, define them all in one fell swoop
        for(char i ='a'; i<='y'; i++) {
            final char finalI = i;
            methodMap.put(i,
                    () -> System.out.println("Boring method " + finalI + " invoked"));
        }

        //If they are not similar, define them separately.
        methodMap.put('z',
                () -> System.out.println("This method is very different!"));

        String userInput = "abvdxz";
        for(char s: userInput.toCharArray())
            methodMap.get(s).run();
    }
}

输出:

Method a invoked
Method b invoked
Method v invoked
Method d invoked
Method x invoked
This method is very different!

这个想法是,您可以在定义函数时将它们放在地图中(如果函数相似,它甚至会更简单)。为了阅读和分析用户输入,我建议使用Tim Biegeleisen的答案中的方法。在这里,我假设已经完成了操作,并着重于尝试避免使用switch语句。