【问题标题】:How to parse text from multiple strings?如何从多个字符串中解析文本?
【发布时间】:2013-02-01 16:39:44
【问题描述】:

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

当我遍历它时,我会为每一行得到一个字符串。例如,第一个将包含 VLAN 名称状态和端口。所以现在我有一个问题,我怎样才能让 VLAN 1 有 x 个端口处于活动状态。它们在不同的字符串中。这是我对一行感兴趣的当前更简单命令的代码和屏幕截图:

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);
        }
    }
};

现在我想改变它,这样我就可以处理多行了。如果字符串包含某些信息,最好的方法是存储字符串吗?

我需要在右边输出这个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"

【问题讨论】:

    标签: java android string parsing


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢很有趣,我会接受你的回答。我喜欢 echo 选项,它对我部分有用(只适用于按钮 atm),值得考虑。不幸的是,客户可以将交换机名称更改为他们想要的任何名称,我刚刚考虑过,但它总是以 # 结尾。由于这个原因,我现在可能需要更改我的代码,也许检查是否有一个前面有一个字母的哈希。谢谢,取决于我将处理任何输出的命令,幸运的是我也编写了实际的开关,所以知道不会有太大的偏差。
    【解决方案2】:

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

    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;
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多