如何解析多个字符串中的文本?

时间:2013-02-01 16:39:44

标签: java android string parsing

我正在使用终端仿真器库来创建终端,然后我用它将通过串口输入的数据发送到串行设备。当数据被发回时,我想解析它并在editText中向用户显示最重要的信息。目前我收到字节数组/块,我将它们转换为字符串。当我得到\ r或\ n时,我会创建一个新字符串并重复该过程。这适用于大多数命令,但是有些命令会在多行上返回结果,例如“show vlan”:

enter image description here

当我遍历这个时,我得到每一行的字符串。第一个包含VLAN名称状态和端口,作为示例。所以现在我有一个问题,我怎么能将VLAN 1的x端口激活。它们有不同的字符串。这是一个当前更容易命令的代码和屏幕截图,我对这一行感兴趣:

enter image description here

Handler viewHandler = new Handler();
Runnable updateView = new Runnable() {
    @Override

    public void run() {

        mEmulatorView.invalidate();

        if (statusBool == true) {
            for (int i = 0; i < dataReceived.length(); i++) {
                parseCommand = parseCommand + dataReceived.charAt(i);

 if (dataReceived.charAt(i) == '\n' || dataReceived.charAt(i) == '\r'){

    if(parseCommand.contains("KlasOS"))
            {

        String[] tokens = parseCommand.split("\\s{1,}");

        final String ReceivedText = mReceiveBox.getText().toString() + " "
        + new String("Software Version: " + tokens[1] + "\n" );

        runOnUiThread(new Runnable() {
            public void run() {
                                mReceiveBox.setText(ReceivedText);
                                mReceiveBox.setSelection(ReceivedText.length());

                            }
                        });         

                            }

                parseCommand = "";

            }               
            }

            statusBool = false;
            viewHandler.postDelayed(updateView, 1000);
        }
    }
};

现在我想改变它,这样我可以处理多行。如果ebst包含某些信息,它们是否会存储字符串?

我需要在右侧editText输出:

“以下端口在vlan 1上:Fa1 / 0,fa1 / 1,fa1 / 2,fa1 / 3,fa1 / 4,fa1 / 5,fa1 / 6,fa1 / 7,fa1 / 8,fa1 / 9,fa1 / 10,fa1 / 11,Gi0“

2 个答案:

答案 0 :(得分:2)

基本上,您需要一种方法来可靠地检测命令结果的结束。然后归结为发送命令,从设备读取数据,直到遇到结果结束,最后解析结果。

我会像你自己的回答一样扫描提示符(switch#)。也许您甚至可以强制设备使用更奇特的字符序列,这在命令的常规输出中不太可能发生,并且更容易检测结果的结束。例如,您可以尝试将提示配置为包含控制字符,如^ G或^ L.或者,如果您的用户不介意,您可以始终发送第二个发出此类序列的命令,例如“show vlan; echo ^ G”。

您还应该为命令错误做好准备,这会导致不同的输出,例如,预期的行数越来越少或输出格式完全不同。结果甚至可能包含常规输出和警告或错误。

答案 1 :(得分:0)

我用一个布尔和一些字符串以杂乱的方式解决了这个问题。我做了一个附加字符串的方法。

if((parseCommand.contains("VLAN Name") && parseCommand.contains("Status")&& parseCommand.contains("Ports")) 
                            || ((ShowVlanAppend.contains("VLAN Name")&& ShowVlanAppend.contains("Status")&& ShowVlanAppend.contains("Ports"))))
                        {
                                commandParse();
                                if(finalCommandBool == true){
                                runOnUiThread(new Runnable() {
                                    public void run() {

                                        mReceiveBox.setText(finalCommand);
                                        mReceiveBox.setSelection(finalCommand.length());
                                        ShowVlanAppend = "";
                                        finalCommand = "";
                                        finalCommandBool = false;
                                    }
                                });

                                }


                        }
 public void commandParse()

        {
            if (!parseCommand.contains("switch#")){
            ShowVlanAppend = ShowVlanAppend + parseCommand;
            }
            else{
                finalCommand = ShowVlanAppend;
                finalCommandBool = true;
            }

        }