Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析来自多个字符串的文本?_Java_Android_String_Parsing - Fatal编程技术网

Java 如何解析来自多个字符串的文本?

Java 如何解析来自多个字符串的文本?,java,android,string,parsing,Java,Android,String,Parsing,我使用终端仿真器库创建终端,然后使用它将通过串行输入的数据发送到串行设备。当数据被发回时,我想解析它,并在编辑文本中向用户显示最重要的信息。目前,我接收字节数组/块,并将它们转换为字符串。当我得到一个\r或\n字符串时,我会创建一个新字符串,并且该过程会重复。这对于大多数命令来说都很好,但是有些命令会在多行上返回结果,如此处的“show vlan”: 当我循环通过它时,每一行都有一个字符串。例如,第一个将包含VLAN名称状态和端口。所以现在我有一个问题,我如何才能在VLAN 1中有x个端口处于

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

当我循环通过它时,每一行都有一个字符串。例如,第一个将包含VLAN名称状态和端口。所以现在我有一个问题,我如何才能在VLAN 1中有x个端口处于活动状态。它们是不同的字符串。下面是当前Easter命令的代码和屏幕截图,我对其中一行很感兴趣:

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

Handler viewHandler=new Handler();
Runnable updateView=new Runnable(){
@凌驾
公开募捐{
mEmulatorView.invalidate();
如果(statusBool==true){
对于(int i=0;i
现在我想改变这个,这样我可以处理多行。如果字符串包含某些信息,ebst方法是否会存储字符串

我需要将其输出到右边的编辑文本:


“以下端口位于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”

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

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

        }

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

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


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

非常有趣,我将接受您的回答。我喜欢echo选项,它对我部分有效(只对atm按钮有效),值得考虑。不幸的是,客户可以将交换机名称更改为他们想要的任何名称,这是我刚刚考虑过的,但是它总是以#结尾。由于这个原因,我现在可能需要更改代码,可能需要检查是否有一个带有字母的散列。谢谢,根据命令,我将处理任何输出,幸运的是,我对实际开关也进行了编码,因此知道不会有太多偏差。