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 darse cuenta de la falta de coincidencia de una expresión regular en Golang?

Este es un ejemplo de pregunta de opción múltiple. Quiero obtener el texto en chino como “英国、法国”, “加拿大、墨西哥”, “葡萄牙、加拿大”, “墨西哥、德国” en el contenido del siguiente código en golang, pero no funciona.

package main

import (
    "fmt"
    "regexp"
    "testing"
)

func TestRegex(t *testing.T) {
    text := <code>( B )38.目前,亚马逊美国站后台,除了有美国站点外,还有(    )站点。
A.英国、法国B.加拿大、墨西哥
C.葡萄牙、加拿大D.墨西哥、德国
</code>

fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.(\S+)?`).FindAllStringSubmatch(text, -1))
fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.`).Split(text, -1))

}

text:
( B )38.目前,亚马逊美国站后台,除了有美国站点外,还有(    )站点。
A.英国、法国B.加拿大、墨西哥
C.葡萄牙、加拿大D.墨西哥、德国

patrón: [A-E]\.(\S+)?

Resultado actual: [["A.英国、法国B.加拿大、墨西哥" "英国、法国B.加拿大、墨西哥"] ["C.葡萄牙、加拿大D.墨西哥、德国" "葡萄牙、加拿大D.墨西哥、德国"]].

Resultado esperado: [["A.英国、法国" "英国、法国"] ["B.加拿大、墨西哥" "加拿大、墨西哥"] ["C.葡萄牙、加拿大" "葡萄牙、加拿大"] ["D.墨西哥、德国" "墨西哥、德国"]].

Creo que podría ser un problema de modo de búsqueda voraz. Porque en mi código, lee la opción A y la opción B como una sola opción directamente.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada, el patrón regex debería capturar el texto chino entre las opciones. Una forma de hacer esto es utilizando una afirmación de búsqueda positiva para coincidir con todo lo que está después de la letra de la opción hasta la próxima letra de la opción o el final de la cadena que comienza con un carácter chino:

    patrón := `[A-E]\.(.*?)(?=[A-E]\p{Han}|$)`
    correspondencias := regexp.MustCompile(patrón).FindAllStringSubmatch(texto, -1)
    fmt.Printf("%q\n", correspondencias)
    

    Este patrón coincide con una letra de opción seguida de un punto, captura cualquier carácter (no codicioso) y verifica que el siguiente texto sea otra letra de opción seguida de un carácter chino o el final de la cadena.

    La salida de este código será:

    [["A.英国、法国" "英国、法国"]
     ["B.加拿大、墨西哥" "加拿大、墨西哥"]
     ["C.葡萄牙、加拿大" "葡萄牙、加拿大"]
     ["D.墨西哥、德国" "墨西哥、德国"]]
    

    Este código captura el texto chino de manera no codiciosa y devuelve las coincidencias esperadas.

Comments are closed.