Java 如何解析来自多个字符串的文本?
我使用终端仿真器库创建终端,然后使用它将通过串行输入的数据发送到串行设备。当数据被发回时,我想解析它,并在编辑文本中向用户显示最重要的信息。目前,我接收字节数组/块,并将它们转换为字符串。当我得到一个\r或\n字符串时,我会创建一个新字符串,并且该过程会重复。这对于大多数命令来说都很好,但是有些命令会在多行上返回结果,如此处的“show vlan”: 当我循环通过它时,每一行都有一个字符串。例如,第一个将包含VLAN名称状态和端口。所以现在我有一个问题,我如何才能在VLAN 1中有x个端口处于活动状态。它们是不同的字符串。下面是当前Easter命令的代码和屏幕截图,我对其中一行很感兴趣:Java 如何解析来自多个字符串的文本?,java,android,string,parsing,Java,Android,String,Parsing,我使用终端仿真器库创建终端,然后使用它将通过串行输入的数据发送到串行设备。当数据被发回时,我想解析它,并在编辑文本中向用户显示最重要的信息。目前,我接收字节数组/块,并将它们转换为字符串。当我得到一个\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);
}
}
};
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按钮有效),值得考虑。不幸的是,客户可以将交换机名称更改为他们想要的任何名称,这是我刚刚考虑过的,但是它总是以#结尾。由于这个原因,我现在可能需要更改代码,可能需要检查是否有一个带有字母的散列。谢谢,根据命令,我将处理任何输出,幸运的是,我对实际开关也进行了编码,因此知道不会有太多偏差。