匹配x正则表达式或y正则表达式

Min*_*int 5 php regex preg-match

我目前有这个:

^(.+)\(\w+\)|^(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
Run Code Online (Sandbox Code Playgroud)

#1它只匹配Foo的
#2 Foo是正确的
#3匹配foo但是它在第3个数组项[2]中:

3rd array output:
    (
        [0] => Foo (100:200 - 300:400)
        [1] => 
        [2] => Foo
    ) 
Run Code Online (Sandbox Code Playgroud)


粗体是我想要匹配的:
Foo(match11)这个(100:200 - 300:400)结束#1
Foo有(not_matched)(100:200 - 300:400)结束#2
Foo(100 :200 - 300:400)结束#3
注意:我没有尝试匹配每一行末尾的#1,#2,#3,仅供参考.

如果找到"(100:200 - 300:400)"然后得到它前面的任何文字,如果"(not_matched)(100:200 - 300:400)"找到然后得到它前面的任何文字,否则得到"(100:200 - 300:400)"前面的文字

可以识别elseif部分"(not_matched)(100:200 - 300:400)",因为它在not_matched和(100:200 - 300:400)的2个圆括号之间只有1个空格.


编辑:

这就是我提出的似乎有效的方法,虽然它需要一些PHP中的解决方法才有用.

(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
Run Code Online (Sandbox Code Playgroud)

工作示例:http://www.rubular.com/r/NSpGcnyg0p
由于某种原因,它似乎没有保存我的示例,因此您必须复制/粘贴它.

但正则表达式并没有直接匹配它们,这就是为什么我必须删除php中的空数组元素,以便我在[1]元素中得到结果.

任何人都可以在我的正则表达式中看到我做错了什么?

Tim*_*ker 1

尝试这个:

^.*?(?=\s*(?:\(not_matched\)\s)?\(\d+:\d+\s*-\s*\d+:\d+\))
Run Code Online (Sandbox Code Playgroud)

或者,在 PHP 中:

if (preg_match(
    '/^                   # Anchor the match at start of line
    .*?                   # Match any number of characters lazily
    (?=                   # until just before the following:
     \s*                  # - optional whitespace
     (?:                  # - the following group:
      \(not_matched\)\s   #    - literal (not_matched), followed by 1 whitespace
     )?                   #   (which is optional)
     \(\d+:\d+\s*-\s*\d+:\d+\) # a group like (nnn:mmm - ooo:ppp)
    )                     # End of lookahead assertion
    /x', 
    $subject, $regs)) {
    $result = $regs[0];
} else {
    $result = "";
}
Run Code Online (Sandbox Code Playgroud)