online - regex python
¿Cómo hacer coincidir "cualquier cosa hasta esta secuencia de caracteres" en una expresión regular? (9)
Como @Jared Ng y @Issun señalaron, la clave para resolver este tipo de RegEx como "hacer coincidir todo con una determinada palabra o subcadena" o "hacer coincidir todo después de una determinada palabra o subcadena" se denomina aserción de "longitud total" . Lee más sobre ellos aquí.
En su caso particular, se puede resolver con una mirada positiva hacia adelante. Una imagen vale mas que mil palabras. Vea la explicación detallada en la captura de pantalla.
Toma esta expresión regular: /^[^abc]/
. Esto coincidirá con cualquier carácter individual al principio de una cadena, excepto a, b o c.
Si agrega un *
después de él - /^[^abc]*/
- la expresión regular continuará agregando cada carácter subsiguiente al resultado, hasta que encuentre una a
, o b
, o c
.
Por ejemplo, con la cadena de origen "qwerty qwerty whatever abc hello"
, la expresión coincidirá con "qwerty qwerty wh"
.
Pero qué pasa 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"
?
Creo que necesitas subexpresiones. Si recuerdo bien, puede usar 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 hacer el truco.
El $
marca el final de una cadena, por lo que algo como esto debería funcionar: [[^abc]*]$
donde estás buscando algo que NO TERMINE en ninguna iteración de abc
, pero tendría que estar al final
Además, si está usando un lenguaje de scripting con expresiones regulares (como php o js), tienen una función de búsqueda que se detiene cuando encuentra un patrón por primera vez (y puede especificar comenzar desde la izquierda o comenzar desde la derecha, o con php). puedes hacer una implosión para reflejar la cadena).
Esto tendrá sentido sobre la expresión regular.
- La palabra exacta se puede obtener del siguiente comando de expresiones regulares:
("(.*?)")/sol
Aquí, podemos obtener la palabra exacta a nivel mundial que pertenece dentro de las comillas dobles. Por ejemplo, si nuestro texto de búsqueda es,
Este es el ejemplo de las palabras "doble comillas"
entonces obtendremos "doble cita" de esa oración.
Lo que necesitas es mirar alrededor de la afirmación como .+? (?=abc)
.+? (?=abc)
.
Ver: Lookahead y Lookbehind Cero aserciones de longitud.
Tenga en cuenta que [abc]
no es lo mismo que abc
. Dentro de los paréntesis no es una cadena, cada carácter es solo una de las posibilidades. Fuera de los soportes se convierte en la cadena.
No especificó qué tipo de expresión regular está usando, pero esto funcionará en cualquiera de los más populares que pueden considerarse "completos".
/.+?(?=abc)/
Cómo funciona
El .+?
parte es la versión no codiciosa de .+
(una o más de cualquier cosa). Cuando usamos .+
, El motor básicamente coincidirá con todo. Luego, si hay algo más en la expresión regular, volverá en pasos tratando de coincidir con la siguiente parte. Este es el comportamiento codicioso , es decir , tanto como sea posible para satisfacer .
Cuando se usa .+?
, en lugar de hacer coincidir todos a la vez y regresar para otras condiciones (si las hay), el motor hará coincidir los siguientes caracteres por pasos hasta que la parte subsiguiente de la expresión regular coincida (nuevamente, si la hubiera). Este es el no codicioso , es decir, igualar lo menos posible de satisfacer .
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX"
^^^^^^^^^^^^ ^^^^^^^^^^^^
/.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX"
^^^^ ^
Después de eso tenemos (?=
{contents}
)
, una aserción de ancho cero , una mirada alrededor . Esta construcción agrupada coincide con su contenido, pero no cuenta como caracteres emparejados ( ancho cero ). Solo devuelve si es una coincidencia o no ( aserción ).
Por lo tanto, en otros términos, la expresión regular /.+?(?=abc)/
significa:
Haga coincidir los caracteres lo menos posible hasta que se encuentre un "abc", sin contar el "abc".
Para expresiones regulares en Java, y creo que también en la mayoría de los motores de expresiones regulares, si desea incluir la última parte, esto funcionará:
.+?(abc)
Por ejemplo, en esta línea:
I have this very nice senabctence
selecciona todos los caracteres hasta "abc" y también incluye abc
Usando nuestra expresión regular, el resultado será: I have this very nice senabc
Pruebe esto: https://regex101.com/r/mX51ru/1
Si buscas capturar todo hasta "abc":
/^(.*?)abc/
Explicación:
( )
captura la expresión dentro de los paréntesis para acceder usando $1
, $2
, etc.
^
partido de inicio de línea
.*
coincide con cualquier cosa ?
sin codicia (coincida con el número mínimo de caracteres requeridos) - [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 expresiones regulares son codiciosas , lo que significa que coincidirán tanto como sea posible. Por /^.*abc/
tanto, /^.*abc/
coincidiría con "lo que sea que sea algo abc algo". ¿Agregando el cuantificador no codicioso ?
hace que la expresión regular solo coincida con "cualquier cosa".
prueba esto
.+?efg
Consulta :
select REGEXP_REPLACE (''abcdefghijklmn'',''.+?efg'', '''') FROM dual;
salida:
hijklmn