用于解析此字符串的正则表达式或java解决方案

时间:2013-02-04 15:15:15

标签: java android regex parsing

我正在输入命令show vlan并以此格式接收数据,它是一个字符串:

switch# show vlan
VLAN Name                             Status    Ports                           
---- -------------------------------- --------- ------------------------------- 
1    default                          Active    Fa1/0, Fa1/1, Fa1/4, Fa1/6      
                                                Fa1/7, Fa1/8, Fa1/9, Fa1/10     
                                                Fa1/11, Gi0                     
2    VLAN0002                         Active                                    
3    VLAN0003                         Active    Fa1/5                           
6    VLAN0006                         Active                                    
999  VLAN0999                         Active    Fa1/2, Fa1/3
switch# 

我希望创建以字符串数开头的新字符串,并在达到VLAN编号时结束。所以这里的字符串将是:

(1)    1    default                          Active    Fa1/0, Fa1/1, Fa1/4, Fa1/6      
                                                       Fa1/7, Fa1/8, Fa1/9, Fa1/10     
                                                       Fa1/11, Gi0                     
(2)    2    VLAN0002                         Active                                    
(3)    3    VLAN0003                         Active    Fa1/5                           
(4)    6    VLAN0006                         Active                                    
(5)    999  VLAN0999                         Active    Fa1/2, Fa1/3

我在这里做什么,一个正则表达式,它测试一个数字后跟一个空格,但前面有一个\ r或\ n?或者类似于java使用.charAt(i)等?然后子串呢?

我需要将每个字符串拆分为带有空格分隔符的标记。我会使用for循环遍历每个字符串。

我尝试在\ r \ n分割,如果后跟一个数字,这是对的吗?

String[] parts = finalCommand.split("\r\n?=\\d");

但它不起作用?!我真的不明白为什么。

3 个答案:

答案 0 :(得分:1)

  

我尝试在\ r \ n分割,如果后跟一个数字,这是对的吗?

String[] parts = finalCommand.split("\r\n?=\\d");
     

但它不起作用?!我真的不明白为什么。

如果finalCommand已经删除了前导#switch\r\n并且尾随\r\nswitch#,并且finalCommand中的行确实被{{1}分隔了然后 - 是的,那是几乎正确的。您需要更改的唯一内容是,您需要编写\r\n而不是(?=\d):括号是前瞻断言的语法的一部分。 (否则?=\d被解释为“可选\n?=,后跟\n。”所以:

=

答案 1 :(得分:1)

我认为split()不是您正在寻找的工具。看看这个:

List<String> matchList = new ArrayList<String>();
Pattern p = Pattern.compile("(?m)^\\d+.*$(?:\r?\n(?!\\S).*$)*");
Matcher m = p.matcher(s);
while (m.find()) {
    matchList.add(m.group());
} 

正如您所说,延续线的特征是线分隔符后面的空格。此正则表达式通过在行分隔符后立即对非空白字符(\S)执行否定预测来标识它们。

(?m)启用了多行模式,允许^$匹配各行的开头和结尾。请注意,回车\r)在行分隔符中是可选的,而不是换行符(\n)。

答案 2 :(得分:0)

答案很简单,是某种括号问题

这不起作用:

String[] parts = finalCommand.split("\r\n?=\\d");

这样做:

String[] parts = finalCommand.split("(\r\n)(?=\\d)");