es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo evitar extraer el último carácter específico que forma parte de un grupo de caracteres en una expresión regular?

Dada una línea de comando

mycommand --optional-arguments their-values <patternOfInterestWithDirectoryPath> arg1 arg2

patternOfInterestWithDirectoryPath puede ser cualquiera de los siguientes


path/to/dir
/path/to/dir
path/to/dir/
&quot;path/to/dir&quot;
&quot;/path/to/dir&quot;
&quot;path/to/dir/&quot;

En cualquiera de los casos anteriores, se debe extraer /path/to/dir en todos los casos, donde algunos de ellos pueden (o no) estar encerrados entre comillas dobles, y/o pueden (o no) tener una barra diagonal inicial /

La siguiente expresión regular coincide pero también extrae la barra diagonal más a la derecha.

\Smycommand\s+(?:-\S+\s+)\"?([^\"]+)\/?\"?.*

Adjuntar una negación adelante no funciona


\Smycommand\s+(?:-\S+\s+)"?([^\s"]+(?!\/"))\/?"?.*

¿Tienes alguna idea de cómo ignorar los caracteres para la extracción que forman parte del grupo de la expresión regular pero en una posición específica (por ejemplo, el más a la derecha)?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para ignorar la barra diagonal más a la derecha en el patrón extraído, puedes modificar la expresión regular para usar una búsqueda hacia adelante positiva tanto para la barra diagonal como para el final de la línea. De esta manera, el grupo de la expresión regular no incluirá la barra diagonal más a la derecha. Aquí está la expresión regular modificada:

    \S*mycommand\s+(?:-\S+\s+)*"?([^\s"]+)\/?(?=("|$)).*
    

    Explicación:

    • \S*mycommand\s+: coincide con cualquier carácter que no sea espacio (si hay alguno) antes de “mycommand” y uno o más espacios después de “mycommand”
    • (?:-\S+\s+)*: coincide con cualquier par de “-opción valor” opcional
    • "?: coincide con una comilla doble opcional
    • ([^\s"]+): coincide con cualquier carácter que no sea espacio ni comilla doble y los captura en un grupo
    • \/?: coincide con una barra diagonal opcional
    • (?=("|$)): búsqueda hacia adelante de una comilla doble o el final de la línea (representado por $). Esto asegura que la barra diagonal coincidida en el paso anterior no se incluya en el grupo capturado.
    • .*: coincide con cualquier otro carácter restante (si hay alguno)

    Esta expresión regular debería extraer correctamente /ruta/hasta/dir en todos los casos, incluso aquellos con comillas dobles y barras diagonales iniciales.

Comments are closed.