Php 最多匹配x正则表达式或y正则表达式

Php 最多匹配x正则表达式或y正则表达式,php,regex,preg-match,Php,Regex,Preg Match,我目前有: ^(.+)\(\w+\)|^(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\) #1它只匹配Foo的 #2Foo有哪一个是正确的 #3与foo匹配,但它位于第3个数组项[2]: 3rd array output: ( [0] => Foo (100:200 - 300:400) [1] => [2] => Foo ) 粗体是我想要匹配的: Foo's(match1

我目前有:

^(.+)\(\w+\)|^(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
#1它只匹配Foo的
#2Foo有哪一个是正确的
#3与foo匹配,但它位于第3个数组项[2]:

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

粗体是我想要匹配的:
Foo's(match11)这(100:200-300:400)结束了#1
Foo有(不匹配)(100:200-300:400)结尾#2
Foo(100:200-300:400)结尾#3
注意:我并没有试图匹配每行末尾的#1、#2、#3,这只是为了参考

如果找到“(100:200-300:400)”则获取其前面的任何文本,如果找到“(未匹配)(100:200-300:400)”则获取其前面的任何文本,否则获取其前面的文本(100:200-300:400)

elseif部分“(未匹配)(100:200-300:400)”可以识别,因为它在未匹配和(100:200-300:400)的两个圆括号之间只有一个空格


编辑:

这就是我想出来的,看起来确实有效,尽管它需要php中的一些变通方法才能发挥作用

(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
工作示例:
由于某些原因,它似乎无法保存我的示例,因此您必须复制/粘贴它。

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


有人能看到我在正则表达式中做错了什么吗?

这将与您的第二个示例相匹配:
(.+)(\([\D]+\).+)(\\\D+


这个将匹配另外两个:
(.+)(\([\d\W]+\)。+)(\\\d+)

如果我清楚地理解,这应该可以做到:

/^(.+)(?:\(not_matched\)\s)?(?:\(\d+:\d+\s-\s\d+:\d+\))\s.+\s(#\d+)$/i

这似乎是可行的,但需要一些变通方法才能在php中发挥作用。(读我原来的问题)

如果没有其他人有任何想法,我会选择这个作为答案

(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)
试试这个:

^.*?(?=\s*(?:\(not_matched\)\s)?\(\d+:\d+\s*-\s*\d+:\d+\))
或者,在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 = "";
}

以下模式将匹配所有内容,结果存储到
wanted
键中:

$PATTERN = '/
    (?P<wanted>.*?)\s* # everything
    (\(.+\s.+\)\s+)? # maybe followed by
    (?= # that ends with
        \(\d{3}:\d{3}\s-\s\d{3}:\d{3}\)
    )
    /x';
preg_match($PATTERN, "Foo's (match11) this (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
preg_match($PATTERN, "Foo has (not matched) (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
preg_match($PATTERN, "Foo (100:200 - 300:400) the end", $matches);
var_dump($matches['wanted']);
$PATTERN=/
(?P.*)\s*#一切
(\(.+\s.+\)\s+?)也许接着是
(?=#以
\(\d{3}:\d{3}\s-\s\d{3}:\d{3}\)
)
/x′;
preg_match($PATTERN,“Foo's(match11)this(100:200-300:400)the end”,$matches);
var_dump($matches['wanted']);
preg_match($PATTERN,“Foo has(not matched)(100:200-300:400)end)”,$matches);
var_dump($matches['wanted']);
预赛($PATTERN,“Foo(100:200-300:400)结束“,$matches);
var_dump($matches['wanted']);

在多个版本中选中三个选项

<?php

    $string[] = "Foo's (match11) this (100:200 - 300:400) ";
    $string[] = "Foo has (not_matched) (100:200 - 300:400) ";
    $string[] = "Foo (100:200 - 300:400) ";

    $reg = "~(.*)(\([^\)]*\))?\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\)~iU";

    foreach ( $string as $s ){
        preg_match_all ( $reg, $s, $m , PREG_SET_ORDER);

        print "<br />String: ". $s . "<br /><pre>";
        print_r ( $m );
        print "</pre><br />OR";
    print "The String Required is: " . $m[0][1] . "<br />";
    }

?>

请把你的问题说得更清楚一些……是的,很抱歉,我有点搞不清楚我想做什么,我想我已经澄清了。接近了,但我不想要“2个匹配”(不匹配)。我只想让它与“Foo has”匹配,因为第二个我只想与“Foo has”匹配,但是这个正则表达式也与我不想匹配的“(not_matched)”部分匹配。数组([0]=>Foo有(不匹配的)(100:200-300:400)结尾#2[1]=>Foo有(不匹配的)[2]=>。谢谢
$output = $m[0][1];