0

我正在输入命令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 编号开头并在达到 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");

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

4

3 回答 3

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)。

于 2013-02-04T17:22:54.577 回答
1

如果后面跟着一个数字,我尝试在 \r\n 处拆分,对吗?

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

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

如果finalCommand是在你已经去掉了前导#switch\r\n和尾随\r\nswitch#之后,并且如果行中的行finalCommand确实由 分隔\r\n,那么 - 是的,这几乎是正确的。您唯一需要更改的是,您需要编写(?=\d)而不是?=\d:括号是前瞻断言语法的一部分。(否则\n?=被解释为“一个可选的\n,后跟=。)所以:

String[] parts = finalCommand.split("\r\n(?=\\d)");
于 2013-02-04T17:01:11.600 回答
0

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

这不起作用:

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

这样做:

String[] parts = finalCommand.split("(\r\n)(?=\\d)");
于 2013-02-04T17:01:22.233 回答