2011-09-09 12 views
8

Quiero una expresión regular para que coincida con todos ellos:expresiones regulares de búsqueda hacia delante opcional

  1. startabcend
  2. startdef
  3. blahstartghiend
  4. blahstartjklendsomething

y para volver abc, def, ghi y jkl respectivamente.

Tengo este el siguiente que funciona para el caso 1 y 3 pero estoy teniendo problemas para hacer el lookahead opcional.

(?<=start).*(?=end.*) 

Editar:

Hmm. Mal ejemplo. En realidad, el bit en el medio no es numérico, sino que está precedido por un cierto conjunto de caracteres y, opcionalmente, tiene éxito. He actualizado las entradas y salidas según lo solicitado y he agregado un 4to ejemplo en respuesta a la pregunta de alguien.

Respuesta

8

Tratando de leer entre líneas, parece que tal vez usted no quiere lookahead aquí, en realidad se quiere no expansivo .*?.

(?<=start).*?(?:end)?$ 

Mi conjetura es que usted está tratando de igualar en contra de algo como "start123end", pero no quiere que el end o la start a aparecer en el texto coincidente, y por lo tanto tiene las afirmaciones Lookaround allí para limitar el .* que normalmente es codicioso.

En su lugar, puede utilizar la variante no codiciosa y anclar el extremo derecho del patrón con un $.

(Alternativamente, si usted es capaz de utilizar los grupos de captura, sólo debe hacerlo en su lugar:

start(.*?)(end)?$ 

y luego acaba de obtener el valor del primer grupo de captura.)

1

Una búsqueda hacia delante opcional no tiene sentido:

Si es opcional entonces está bien si coincide, pero también es aceptable si no coincide. Y como un vistazo no extiende la coincidencia, no tiene ningún efecto.

Por lo tanto, la sintaxis para un lookahead opcional es la cadena vacía.

+0

Necesito devolver el bit en el medio sin el sufijo opcional. –

+0

Entonces, ¿debería coincidir con 'start456otherstuff'? –

+0

no, pero debe coincidir con start456endotherstuff pero solo devuelve 456. –

0

¿Por qué necesita mirar hacia adelante?

start(\d+)\w* 

verlo en rubular

5

Tal como esto:

(?<=start).*?(?=(?:end|$)) 

Esto corresponderá con hasta "inicio" y "fin" o hasta el final de la línea, además, el cuantificador tiene que ser no codicioso (.*?)

Ver es here on Regexr

Extendió el ejemplo en Regexr para no solo trabajar con dígitos.

2

Lookahead solo no hará el trabajo. Prueba esto:

(?<=start)(?:(?!end).)* 

Las posiciones de búsqueda hacia atrás usted después de la palabra "Inicio", luego el resto de la que consume todo hasta (pero no incluyendo) la siguiente aparición del "fin".

Aquí hay una demo on Ideone.com

1

si "final" siempre va a estar presente, a continuación, utilizar: (?<=start)(.*?)(?=end) y cuando se pone en el PO. Como dices "hacer que la búsqueda de futuro sea opcional", simplemente sube hasta que llegue el "final" o el carro de regreso. (?<=start)(.*?)(?=end|\n). Si no le importa capturar el grupo "final", puede omitir la búsqueda anticipada y hacer (?:start)?(.*?)(?:end)? que se iniciará después de "inicio", si está allí y se detiene antes de "finalizar", si está allí. También puede usar más de esos patrones "o" canalizados: (?:start|^) y (?:end|\n).

Cuestiones relacionadas