正则表达式:匹配相同字符串的两个不同部分

时间:2013-09-19 06:28:00

标签: php regex

我有以下字符串:

  

{!ex = track_created_f} track_created_f:[NOW / DAY-3MONTHS / DAY TO NOW / DAY]

我想匹配/提取 track_created_f NOW / DAY-3MONTHS / DAY TO NOW / DAY 。 {!ex = track_created_f}可能始终存在,也可能不存在,因此正则表达式不应该依赖于此部分。

但是,它是我需要匹配的第二个track_created_f(而不是track_created_f,它是!ex = track_created_f的一部分)。

到目前为止我得到的是以下内容(see this link for live preview):

[^.*(\w+)\:\[(.*)?\]$]

然而,这只是给了我:

Array
(
    [0] => {!ex=track_created_f}track_created_f:[NOW/DAY-3MONTHS/DAY TO NOW/DAY]
    [2] => f
    [2] => NOW/DAY-3MONTHS/DAY TO NOW/DAY
)

我无法真正掌握的是我如何使用正则表达式来匹配我想要匹配的字符串部分,并且只返回该部分。就像现在一样,(0)返回整个字符串以及(1) track_created_f 的不太匹配和(2) NOW / DAY-3MONTHS / DAY的匹配现在/现在

我一直试图通过阅读文档来解决这个问题,但我不确定我是否正确行事 - 尤其是可选的'?&#39 ;我已经投入的条款。这是匹配字符串子集的正确方法吗?

2 个答案:

答案 0 :(得分:3)

[^.*(\w+)\:\[(.*)?\]$]是一个错误的正则表达式。你实际上把整个正则表达式放在一个正则表达式字符类中。

以下正则表达式足够

/(\w+):\[([^\]]+)/

答案 1 :(得分:0)

^(?:{\!ex=\w+}|)(.*):\[(.*)?\]$

这将使{!ex=track_created_f}部分成为可选。

请参阅:http://www.phpliveregex.com/p/1gc