我正在输入命令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");
但它不起作用?!我真的不明白为什么。
答案 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)");