2010-07-20 64 views
1

我正在解析一個文本文件,並在下面顯示的窗體中獲得多行。正則表達式在Perl中將一行分割爲三段

然後我嘗試將每一行分成三段:Part1:sf;第二部分:名稱;第三部分:方向。

但現在我遇到了如何寫出正則表達式的困難。我曾經想過在空格分割和使用陣列來連接新的字符串:

S15,F49 Large Recipe Download Request (LRDR) S,H->E,reply 

my ($sf, $name, $direction) =~/I don't know how to implement here/ 

我怎樣才能獲得$ SF = S15,F49 //其他線路一樣S1,F11; S6,F1; etc

$ name = Large Recipe Download Request (LRDR) //不同的$ sf的不同名稱。

$方向= S,H->E,reply; //一些時間,它是M,H<-E,replyS,H<->ES,H->E,[reply]等沒有爲3部分的每個子項之間沒有空格:$方向

+0

給定行的格式始終保持不變: S15,F49大型配方下載請求(LRDR)S,H-> E,回覆 像第一部分將包含逗號(,)或第二部分將包含圓括號()總是? – 2010-07-20 09:10:46

+0

@Nikhil。是的,我只是想將這一行分成三段,並根據輸出生成一個XML文件。 – 2010-07-21 01:02:13

回答

4

如果在$sf內沒有空白和在$direction項目,那麼你可以在下面的代碼適用於每一行:

if ($subject =~ m/^(\S+)\s+(.*?)\s+(\S+)$/) { 
    $sf = $1; 
    $name = $2; 
    $direction = $3; 
} else { 
    // no match found 
} 

說明:

^:在字符串的開始處錨定正則表達式。

(\S+):匹配一個或多個非空格字符。捕獲$1中的匹配。

\s+:匹配一個或多個空格字符(=分隔符到下一個項目)。 。

(.*?):匹配任何數目的字符,儘可能少仍然允許整體匹配成功,並捕獲在$2 *

\s+(\S+):與上面類似 - 匹配空格分隔符(S)和非空格字符 - >$3

$:將搜索錨定在字符串末尾。


*的原因懶惰量詞*?是,否則,正則表達式,這部分也將捕獲所有除了最後一個下面的空間分隔。

+1

起初我很好奇這是否會因爲第二組的非貪心而起作用。但是由於最後一組需要至少一個字符,所以它工作正常。如果第二組是貪婪的,我認爲它可能稍微快一點點,因爲它應該不太頻繁地回溯,但我不是100%確定的。當然,這將是一個微型優化,但我們不知道這個代碼被調用的頻率。 – musiKk 2010-07-20 09:16:36

+0

我不認爲這會對性能產生很大的影響。但是,匹配結果會有所不同,具體取決於我是使用懶惰還是貪婪量詞(請參閱底部的編輯)。 – 2010-07-20 09:23:36

+0

它工作得很好。 – 2010-07-20 09:25:11

2
my $str = "S15,F49 Large Recipe Download Request (LRDR) S,H->E,reply"; 

$str =~ /^([^\s]+) # sf: anything except whitespace until first whitespace 
      \s+ 
      (.+)  # name: anything 
      \s+ 
      ([^\s]+)$ # direction: anything except whitespace, from last 
        # whitespace to the end 
     /x; 
my ($sf, $name, $direction) = ($1, $2, $3); 
print $sf, "\n", $name, "\n", $direction, "\n"; 
1

從大家展示一下,這應該工作:通過以上兩個或多個空格

my ($sf, $name, $direction) = split /\s{2,}/, $line; 

拆分。

這將自動格格:

my ($sf, $name, $direction) = split /\s{2,}|\n/, $line; 
+0

我未能用您的拆分方法實施。 請參閱鏈接瞭解更多詳情。 http://codepad.org/8n5b8pAd 我的筆記本電腦 顯示警告(使用的activeperl 5.10):(。)的串聯或串在d未初始化值$方向的使用:\學習\ Perl的\ nextLine.pl線24 ,第3行。 direction = – 2010-07-21 01:15:40

+0

在粘貼網站上,您有一個選項卡。名稱和方向之間。所以我會改變正則表達式來讀取'/ \ s {2,} | \ t | \ n /'並且得到我需要的。在你的例子中,你有3個空格。 – Axeman 2010-07-21 02:45:37