2014-12-08 84 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)