2011-01-30 60 views
5

este momento tengo esto:Partido hasta x expresiones regulares o y expresiones regulares

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

El # 1 sólo partidos de Foo
# 2 Foo tiene que es correcta
# 3 coincide foo pero está en el 3er elemento de la matriz [2]:

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


La negrita es lo que estoy tratando de igualar:
de Foo (match11) esta (100: 200 - 300: 400) al final # 1
Foo tiene (not_matched) (100: 200-300: 400) el final # 2
Foo (100: 200 - 300: 400) el final # 3
nota: im no tratar de coincidir con el # 1, # 2, # 3 al final de cada línea, eso solo como referencia.

Si se encuentra "(100: 200 - 300: 400)", obtenga cualquier texto delante de él, elseif "(not_matched) (100: 200 - 300: 400)" encontrado luego obtenga cualquier texto en frente de ello, si no, obtenga texto delante de "(100: 200 - 300: 400)"

La parte elseif "(not_matched) (100: 200 - 300: 400)" puede identificarse ya que solo tiene 1 blanco espacio entre los 2 soportes redondos de not_matched y (100: 200 - 300: 400)


Editar:

Esto es lo que se me ocurrió que parece funcionar, aunque requiere algunas soluciones en php para ser útil.

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

Ejemplo de trabajo: http://www.rubular.com/r/NSpGcnyg0p
Por alguna razón, no parece guardar mi ejemplo, por lo que tendrá que copiar/pegar en

Pero la expresión regular no tiene. coincidencia directa en cada uno de ellos, por eso tengo que eliminar el elemento de matriz vacío en php para que obtenga el resultado en el elemento [1].

¿Alguien puede ver lo que estoy haciendo mal en mi expresión regular?

+2

Por favor, haga su pregunta más clara ... – shybovycha

+0

Sí lo siento por eso, un poco confundido en cuanto a lo que yo estaba tratando hacer, creo que lo aclare. – Mint

Respuesta

1

Prueba esto:

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

o, en 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 Sabía que era posible en una expresión regular, solo tenía que hacer mi pregunta correctamente. Gracias – Mint

0

Esto coincidirá con su segundo ejemplo: (.+)(\([\D]+\).+)(\#\d+).

Y este coincidirá con otros dos: (.+)(\([\d\W]+\).+)(\#\d+).

+0

Cerrar, pero para # 2 coincide con "(not_matched)" que no quiero. Solo quiero que coincida con "Foo tiene" para el n. ° 2 – Mint

0

Si entiendo con claridad, esto debe hacer el truco:

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

El segundo intento tratando de hacer coincidir solo "Foo tiene" pero esta expresión regular también coincide con la parte "(no coincidente)" con la que no quiero hacer coincidir. Matriz ( [0] => Foo tiene (not_matched) (100: 200 - 300: 400) el final # 2 [1] => Foo tiene (not_matched) [2] => # 2 ) – Mint

0

Esto parece funcionar, pero necesita un poco de solución para ser útil en php. (lea mi pregunta original).

Voy a seleccionar esto como la respuesta si nadie más tiene alguna idea ...

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

El siguiente patrón coincidirá con todo, el resultado se almacena en la clave 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 comprobado, en varias versiones.

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

?> 

Su trabajo, y se puede obtener la cadena necesaria en

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