2011-01-30 12 views
5

Obecnie mam to:Mecz września x regex lub y regex

^(.+)\(\w+\)|^(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\) 

# 1 to tylko mecze Foo
# 2 Foo ma która jest poprawna
nr 3 pasuje foo ale w 3. elementu tablicy [2]:

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


pogrubiona jest co usiłuję dopasować:
Foo (match11) to (100: 200 - 300: 400) zakończenia # 1
Foo ma (not_matched) (100: 200 - 300: 400) zakończenia # 2
Foo (100: 200 - 300: 400) koniec # 3
uwaga: im nie próbuje dopasować # 1, # 2, # 3 na końcu każdej linii, to tylko w celach informacyjnych.

Jeśli "(100: 200 - 300: 400)" zostanie znaleziony, to uzyskaj dowolny tekst przed nim, elseif "(not_matched) (100: 200 - 300: 400)" znaleziony, a następnie uzyskaj dowolny tekst z przodu z tego, w przeciwnym razie uzyskasz tekst przed "(100: 200 - 300: 400)"

Część elseif "(not_matched) (100: 200 - 300: 400)" można zidentyfikować, ponieważ ma tylko 1 biały przestrzeń pomiędzy 2 okrągłych nawiasach not_matched i (100: 200 - 300: 400)


Edycja:

To jest to, co wymyśliłem, które wydaje się działać, chociaż wymaga niektórych obejść w php, aby były przydatne.

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

przykład robocza: http://www.rubular.com/r/NSpGcnyg0p
Z jakiegoś powodu nie wydaje się, aby zapisać moim przykładem, więc będziesz musiał skopiować/wkleić go w

Ale regex nie posiada. Bezpośrednie dopasowanie na każdym z nich, to dlatego muszę usunąć pusty element tablicy w php, aby uzyskać wynik w elemencie [1].

Czy ktoś może zobaczyć, co robię źle w moim regex?

+2

Proszę uczynić pytanie bardziej jasne ... – shybovycha

+0

Tak przykro, że się trochę mylić, co starałem do zrobienia, pomyśl, że to wyjaśniłem. – Mint

Odpowiedz

1

Spróbuj tego:

^.*?(?=\s*(?:\(not_matched\)\s)?\(\d+:\d+\s*-\s*\d+:\d+\)) 

lub w 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 = ""; 
} 
+0

I Wiedziałem, że jest to możliwe w jednym regex, po prostu musiałem dostać moje pytanie w prawo. dzięki – Mint

0

To pasuje do Twojego drugiego przykładu: (.+)(\([\D]+\).+)(\#\d+).

I ten będzie pasował do dwóch innych: (.+)(\([\d\W]+\).+)(\#\d+).

+0

Zamknij, ale dla numeru 2 pasuje do "(not_matched)", którego nie chcę. Chcę tylko, aby pasowało do "Foo has" dla # 2 – Mint

0

Gdybym jasno zrozumieć, to powinno załatwić sprawę:

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

Drugi próbuje dopasować tylko "Foo ma", ale to wyrażenie pasuje również do części "(not_matched)", której nie chcę dopasowywać. Tablica ( [0] => foo ma (not_matched) (100: 200 - 300: 400) końca # 2 [1] => foo ma (not_matched) [2] => 2 ) – Mint

0

To wydaje się działać, ale potrzebuje trochę obejście może być przydatna w PHP. (przeczytaj moje oryginalne pytanie).

Wybiorę to jako odpowiedź, jeśli nikt inny nie ma żadnych pomysłów ...

(.+)\s\(\w+\)\s\(|(.+)\s\(\d{3}\:\d{3}\s\-\s\d{3}\:\d{3}\) 
0

Poniższy wzór będzie pasował do wszystkiego, wynik zostanie zapisany w kluczu 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']); 
0

Tripple sprawdzone, w wielu wersjach.

<?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 />"; 
    } 

?> 

Jego działanie, można uzyskać potrzebne ciąg na

$output = $m[0][1];