Regex para capturar grupos e ignorar los dos últimos caracteres donde uno es opcional

Necesito capturar dos grupos de una cadena de entrada. Los valores difieren en la estructura a medida que entran.

Los siguientes son ejemplos de las cadenas entrantes:

Comment = "This is a comment";

NumericValue = 123456;

Lo que estoy tratando de lograr es capturar el valor de cadena de la izquierda del signo igual como un grupo y el valor después del signo igual como un segundo grupo. El punto y coma nunca debe incluirse.

La advertencia es que si el segundo grupo es una cadena, las citas de cada extremo no deben incluirse en ese grupo de captura.

Los resultados esperados serían:

  1. Comentario = "Esto es un comentario";
    • grupo clave => Comentario
    • grupo de valores => Este es un comentario
  2. NumericValue = 123456;
    • grupo clave => NumericValue
    • grupo de valores => 123456

Lo siguiente es lo que tengo hasta ahora. Esto funciona bien para capturar el valor numérico, pero deja la comilla doble final al capturar el valor de la cadena.

(?<key>\w+)\s*=\s*(?:[\"]?)(?<group>.+(?:(?=[\"]?;)))

EDITAR

Cuando se aplica la expresión regular contra un valor de cadena, debe permitir la captura de puntos y comas y comillas dobles dentro de la cadena e ignorar solo las de cierre.

Entonces, si tenemos una entrada de:

Comment = "This is a "comment"; This is still a comment";

El segundo grupo de captura debería ser:

This is a "comment"; This is still a comment

Respuesta 1

Editado en función del comentario a incluir ;y "en los comentarios según los ejemplos dados:

(?<key>\w+)\s*=\s*(?:[\"]?)(?<value>((")(?!;?$)|;(?!$)|[^;"])+)"?;?$

El siguiente, además, no permite ;o no "aparece en el texto numérico. Sin embargo, para incluir esto, tuve que cambiar el nombre de los grupos de captura porque el nombre no se puede usar para más de un grupo.

(?<key>\w+)\s*=\s*((?:")(?<valueT>((")(?!;?$)|;(?!$)|[^;"])+)";?$|(?<valueN>[^;"]+);?$)

Aquí hay una clase que lo prueba.

Para facilitar la lectura, he separado las expresiones regulares keyy las valueexpresiones regulares en la clase. He agregado los casos de prueba en un método dentro de la clase. Sin embargo, esto todavía no maneja el caso de un texto numérico que contiene ;o ". Además, la línea debe recortarse antes de someterse a la prueba de patrón (que creo que es factible).

public class NameValuePairRegex{

    public static void main( String[] args ){
        String SPACE = "\\s*";
        String EQ = "=";
        String OR = "|";

        /* The original regex tried by you (for comparison). */
        String orig = "(?<key>\\w+)\\s*=\\s*(?:[\\\"]?)(?<value>.+(?:(?=;)))";

        String key = "(?<key>\\w+)";
        String valuePatternForText = "(?:\")(?<valueT>((\")(?!;?$)|;(?!$)|[^;\"])+)\";?$";
        String valuePatternForNumbers = "(?<valueN>[^;\"]+);?$";
        String p = key + SPACE + EQ + SPACE + "(" + valuePatternForText + OR + valuePatternForNumbers + ")";

        Pattern nvp = Pattern.compile( p );
        System.out.println( nvp.pattern() );
        print( input(), nvp );
    }

    private static void print( List<String> input, Pattern ep ) {
        for( String e : input ) {
            System.out.println( e );
            Matcher m = ep.matcher( e );
            boolean found = m.find();
            if( !found ) {
                System.out.println( "\t\tNo match" );
                continue;
            }

            String valueT = m.group( "valueT" );
            String valueN = m.group( "valueN" );

            System.out.print( "\t\t" + m.group( "key" ) + " -> " + ( valueT == null ? "" : valueT ) + " " + ( valueN == null ? "" : valueN ) );
            System.out.println(  );
        }

    }

    private static List<String> input(){
        List<String> neg = new ArrayList<>();
        Collections.addAll( neg, 
                "Comment = \"This is a comment\";",
                "Comment = \"This is a comment with semicolon ;\";", 
                "Comment = \"This is a comment with semicolon ; and quote\"\";",
                "Comment = \"This is a comment\"", 
                "Comment = \"This is a \"comment\"; This is still a comment\";",
                "NumericValue = 123456;",
                "NumericValue = 123;456;",
                "NumericValue = 123\"456;",
                "NumericValue = 123456" );

        return neg;
    }

}

Respuesta original:

La siguiente expresión regular modificada cumple los requisitos que mencionó. Agregué la exclusión de ;y "de la parte del valor.

Original que probaste:

(?<key>\w+)\s*=\s*(?:[\"]?)(?<group>.+(?:(?=[\"]?;)))

El cambiado:

(?<key>\w+)\s*=\s*(?:[\"]?)(?<value>[^;"]+)
Respuesta: 2

Tengo una máquina virtual y estoy usando Spring Tool Suite y JDK7. He descargado mi proyecto desde git pero recibo un error en pom.xml: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 o ...

He intentado todo y estoy tan frustrado en esta etapa con mi inicio de sesión de Android, ¿alguien puede ayudar, POR FAVOR! Tengo una pantalla de inicio de sesión que le pide al usuario que ingrese el correo electrónico y la contraseña, cuando hacen clic en iniciar sesión necesita ...

¿Es seguro usar instancias de objetos que se declararon en el subproceso de interfaz de usuario principal del método doInBackground () de AsyncTask?

Tengo una lista de nombres que consta de 4 contextos. Los contextos 1,2 y 3 están vinculados al nodo raíz, y el contexto 4 está vinculado al contexto 2. Puedo enumerar el nombre del contexto 1-3 pero no puedo obtener el contexto 4. ...