2014-12-08 47 views
1

我試圖從RTTTL的字符串捕捉命令的命令是這樣的:匹配EOL字符?

2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4, 1p, 2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4 

我使用的正則表達式是(\S+),|$與全球和多對,因爲我讀了$匹配EOL時,多行模式但是這種情況不會發生,因此我無法捕獲最後一條命令1a4,這會結束該行。所有其他命令都從組中捕獲。

我應該用什麼正則表達式捕獲最後一條命令?

回答

0

只需添加如下所示的預覽或非捕獲組。而讓你從組索引要串1

(\S+)(?:,|$) 

DEMO

OR

(\S+)(?=,|$) 

DEMO

你並不需要有一個捕獲組也採用超前時。

\S+(?=,|$) 

(?=,|$)正先行斷言匹配必須遵循由線錨定件的,或結束。 \S+匹配一個或多個非空格字符。

+0

啊哈!這樣可行!謝謝,我對正則表達式很陌生。我會盡快接受答案。 – 2014-12-08 08:39:56

0

另一種解決方案

$a = " 2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4, 1p, 2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4"; 
$r=explode(",",preg_replace("/\\s+/","",$a)); 
var_dump($r); 

輸出:

array (size=37) 
    0 => string '2a4' (length=3) 
    1 => string '2e' (length=2) 
    2 => string '2d#' (length=3) 
    3 => string '2b4' (length=3) 
    4 => string '2a4' (length=3) 
    5 => string '2c' (length=2) 
    6 => string '2d' (length=2) 
    7 => string '2a#4' (length=4) 
    8 => string '2e.' (length=3) 
    9 => string 'e' (length=1) 
    10 => string '1f4' (length=3) 
    11 => string '1a4' (length=3) 
    12 => string '1d#' (length=3) 
    13 => string '2e.' (length=3) 
    14 => string 'd' (length=1) 
    15 => string '2c.' (length=3) 
    16 => string 'b4' (length=2) 
    17 => string '1a4' (length=3) 
    18 => string '1p' (length=2) 
    19 => string '2a4' (length=3) 
    20 => string '2e' (length=2) 
    21 => string '2d#' (length=3) 
    22 => string '2b4' (length=3) 
    23 => string '2a4' (length=3) 
    24 => string '2c' (length=2) 
    25 => string '2d' (length=2) 
    26 => string '2a#4' (length=4) 
    27 => string '2e.' (length=3) 
    28 => string 'e' (length=1) 
    29 => string '1f4' (length=3) 
    30 => string '1a4' (length=3) 
    31 => string '1d#' (length=3) 
    32 => string '2e.' (length=3) 
    33 => string 'd' (length=1) 
    34 => string '2c.' (length=3) 
    35 => string 'b4' (length=2) 
    36 => string '1a4' (length=3)