0

コマンドshow vlanを入力し、この形式でデータを受信して​​います。これは1つの文字列です。

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が付いている正規表現をテストしますか?または、.charAt(i)などを使用してJavaで同様ですか?そしてそれを部分文字列にしますか?

これらの各文字列を空白区切り文字でトークンに分割する必要があります。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 に答える