Tome esta expresión regular: /^[^abc]/
. Esto coincidirá con cualquier carácter al principio de una cadena, excepto a, b o c.
Si agrega un *
después - /^[^abc]*/
, la expresión regular continuará agregando cada carácter posterior al resultado, hasta que cumpla con un 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, ¿y si quisiera que la cadena coincidente fuera "qwerty qwerty whatever "
... En otras palabras, ¿cómo puedo hacer coincidir todo (pero sin incluir) la secuencia exacta "abc"
?
match but not including
?"qwerty qwerty whatever "
, sin incluir el "abc". En otras palabras, no quiero que sea la coincidencia resultante"qwerty qwerty whatever abc"
.do string.split('abc')[0]
. Ciertamente no es una respuesta oficial a este problema, pero lo encuentro más sencillo que la expresión regular.Respuestas:
No especificó qué sabor de expresiones regulares está utilizando, pero esto funcionará en cualquiera de los más populares que se puedan considerar "completos".
Cómo funciona
La
.+?
parte es la versión no codiciosa de.+
(uno 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, retrocederá en pasos tratando de coincidir con la siguiente parte. Este es el comportamiento codicioso , lo que significa tanto como sea posible para satisfacer .Cuando se usa
.+?
, en lugar de hacer coincidir todos a la vez y volver para otras condiciones (si las hay), el motor hará coincidir los siguientes caracteres paso a paso hasta que coincida la parte posterior de la expresión regular (de nuevo, si corresponde). Este es el poco codicioso , lo que significa que coincide con la menor cantidad posible de satisfacer .Después de eso tenemos , una afirmación de ancho cero , una mirada alrededor . Esta construcción agrupada coincide con su contenido, pero no cuenta como caracteres coincidentes ( ancho cero ). Solo regresa si es una coincidencia o no ( aserción ).
(?=
{contents}
)
Por lo tanto, en otros términos, la expresión regular
/.+?(?=abc)/
significa:fuente
.+?
y.*
?+
significa 1 o más, donde*
significa 0 o más. La inclusión / exclusión de la?
voluntad lo hará codicioso o no codicioso.^(?:(?!abc)(?!def).)*
, puedes encadenar para excluir los patrones que no deseas y todavía tomará todo según sea necesario, incluso si el patrón no existeSi está buscando capturar todo hasta "abc":
Explicación:
( )
capturar la expresión entre paréntesis, para el acceso vía$1
,$2
etc.^
inicio de línea.*
coincide con cualquier cosa,?
sin codicia (coincide con la cantidad mínima de caracteres requerida) - [1][1] La razón por la que esto es necesario es que, de lo contrario, en la siguiente cadena:
de forma predeterminada, las expresiones regulares son codiciosas , lo que significa que coincidirá tanto como sea posible. Por
/^.*abc/
lo tanto , coincidiría con "lo que sea que sea algo por algo". Agregar el cuantificador no codicioso?
hace que la expresión regular solo coincida con "lo que sea que sea algo".fuente
sed
no parece admitir coincidencias no codiciosas, ni admite mirar alrededor ((?=...)
). ¿Que más puedo hacer? Comando de ejemplo:echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"
vuelvetwo,three, FOUR FIVE
, pero esperotwo,three
...two
, notwo,three
.Como señalaron @Jared Ng y @Issun, 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 llama aserciones de "longitud de búsqueda". . Lee más sobre ellos aquí.
En su caso particular, se puede resolver con una mirada positiva hacia el futuro:
.+?(?=abc)
Una imagen vale mas que mil palabras. Vea la explicación detallada en la captura de pantalla.
fuente
.+?(?=abc)
regex copiable-pastable vale más.Lo que necesitas es mirar alrededor de una aserción
.+? (?=abc)
.Ver: Afirmaciones anticipadas y retrospectivas de longitud cero
Tenga en cuenta que
[abc]
no es lo mismo queabc
. Dentro de los corchetes no es una cadena, cada personaje es solo una de las posibilidades. Fuera de los corchetes se convierte en la cadena.fuente
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á:
Por ejemplo, en esta línea:
seleccione todos los caracteres hasta "abc" y también incluya abc
usando nuestra expresión regular, el resultado será:
I have this very nice senabc
Pruebe esto: https://regex101.com/r/mX51ru/1
fuente
Terminé con esta pregunta de stackoverflow después de buscar ayuda para resolver mi problema, pero no encontré ninguna solución :(
Así que tuve que improvisar ... después de un tiempo logré alcanzar la expresión regular que necesitaba:
Como puede ver, necesitaba hasta una carpeta por delante de la carpeta "grp-bps", sin incluir el último guión. Y se requería tener al menos una carpeta después de la carpeta "grp-bps".
Editar
Versión de texto para copiar y pegar (cambie 'grp-bps' para su texto):
fuente
Esto tendrá sentido sobre regex.
Aquí, podemos obtener la palabra exacta globalmente que pertenece dentro de las comillas dobles. Por ejemplo, si nuestro texto de búsqueda es,
Este es el ejemplo de las palabras "comillas dobles"
entonces obtendremos "doble cita" de esa oración.
fuente
"
, lo que para mí parece irrelevante para la pregunta.En python:
.+?(?=abc)
funciona para el caso de una sola línea.[^]+?(?=abc)
no funciona, ya que python no reconoce [^] como expresión regular válida. Para que la coincidencia de líneas múltiples funcione, deberá usar la opción re.DOTALL, por ejemplo:fuente
Creo que necesitas subexpresiones. Si no recuerdo mal, puedes usar los
()
corchetes normales para subexpresiones.Esta parte es del manual grep:
Hacer algo como
^[^(abc)]
debería hacer el truco.fuente
Los
$
marca el final de una cadena, así que algo como esto debería funcionar:[[^abc]*]$
en la que están buscando algo que no terminen en cualquier iteraciónabc
, pero tendrían que estar en el extremoAdemás, si está utilizando un lenguaje de script con expresiones regulares (como php o js), tienen una función de búsqueda que se detiene cuando se encuentra por primera vez con un patrón (y puede especificar comenzar desde la izquierda o comenzar desde la derecha, o con php, puedes hacer una implosión para reflejar la cadena).
fuente
prueba esto
Consulta :
salida:
fuente