Tome esta expresión regular: /^[^abc]/
. Esta expresión regular coincide con cualquier carácter al principio de una cadena, excepto a, b o c.
Si se añade un *
después de ella - /^[^abc]*/
- la expresión regular continuará añadiendo cada carácter posterior al resultado, hasta que se encuentre con un a
, o b
, o c
.
Por ejemplo, con la cadena fuente "qwerty qwerty whatever abc hello"
, la expresión coincidirá hasta "qwerty qwerty wh"
.
Pero, ¿y si quisiera que la cadena coincidente fuera "qwerty qwerty whatever"
?
...En otras palabras, ¿cómo puedo hacer coincidir todo hasta (pero sin incluir) la secuencia exacta "abc"
?
Si quieres capturar todo hasta el "abc":
/^(.*?)abc/
Explicación:
( )
captura la expresión dentro de los paréntesis para el acceso mediante $1
, $2
, etc.
^
coincide con el inicio de línea
.*
coincide con cualquier cosa, ?
no coincide con el número mínimo de caracteres requerido) - [1]
[1] La razón por la que esto es necesario es que, de lo contrario, en la siguiente cadena
whatever whatever something abc something abc
por defecto, las regexes son graciosas, lo que significa que coincidirán con todo lo que sea posible. Por lo tanto /^.*abc/
coincidiría con "lo que sea algo abc algo". Si se añade el cuantificador no codicioso ?
, la expresión regular sólo coincidirá con "cualquier cosa que sea algo".
Creo que necesitas subexpresiones. Si no recuerdo mal, puedes utilizar los corchetes normales ()
para las subexpresiones.
Esta parte es del manual de grep:
Back References and Subexpressions
The back-reference \n, where n is a single digit, matches the substring
previously matched by the nth parenthesized subexpression of the
regular expression.
Hacer algo como ^[^(abc)]
debería servir.
El $
marca el final de una cadena, así que algo como esto debería funcionar: [[^abc]*]$
donde se busca cualquier cosa que NO TERMINE en cualquier iteración de abc
, pero tendría que estar al final
Además, si está usando un lenguaje de scripting con regex (como php o js), tienen una función de búsqueda que se detiene cuando encuentra por primera vez un patrón (y puede especificar empezar por la izquierda o empezar por la derecha, o con php, puede hacer un implode para reflejar la cadena).