error de sintaxis en la expresión regular para coincidir con la URL del enlace

StackOverflow https://stackoverflow.com/questions/597608

  •  11-09-2019
  •  | 
  •  

Pregunta

Tengo el siguiente método en algún código nemerle:

private static getLinks(text : string) : array[string] {
        def linkrx = Regex(@"<a\shref=['|\"](.*?)['|\"].*?>");
        def m = linkrx.Matches(text);
        mutable txmatches : array[string];
        for (mutable i = 0; i < m.Count; ++i) {
            txmatches[i] = m[i].Value;
        }
        txmatches
    }

el problema es que el compilador, por alguna razón, está intentando analizar los corchetes dentro de la declaración de expresiones regulares y hace que el programa no se compile.Si elimino la @ (que me dijeron que pusiera allí) aparece un error de carácter de escape no válido en "\s"

Aquí está la salida del compilador:

NCrawler.n:23:21:23:22: ←[01;31merror←[0m: when parsing this `(' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:22:57:22:58: ←[01;31merror←[0m: when parsing this `{' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:8:1:8:2: ←[01;31merror←[0m: when parsing this `{' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'

(la línea 23 es la línea con el código de expresión regular)

¿Qué tengo que hacer?

¿Fue útil?

Solución

No sé Nemerle, pero parece que el uso de @ desactiva todos los escapes, incluyendo el escape para la ".

Pruebe uno de los siguientes:

def linkrx = Regex("<a\\shref=['\"](.*?)['\"].*?>");

def linkrx = Regex(@"<a\shref=['""](.*?)['""].*?>");

def linkrx = Regex(@"<a\shref=['\x22](.*?)['\x22].*?>");

Otros consejos

No soy programador de Nemerle, pero sé que SIEMPRE debes usar el analizador XML para datos basados ​​en XML y no expresiones regulares.

Supongo que alguien ha creado una biblioteca DOM o XPath para Nemerle para que puedas acceder a cualquiera de ellas.

//a[@href] vía XPath o algo así como a.href.value vía DOM.

A esa expresión regular actual no le gusta, por ejemplo

<a class="foo" href="something">bar</a>

No probé esto pero debería ser más parecido.

/<a\s.+?href=['|\"]([^'\">]+)['|\"].+?>/i

El problema es con las comillas, no los soportes. En Nemerle, como en C #, a escapar de una comilla otra comilla, no una barra invertida.

@"<a\shref=['""](.*?)['""].*?>"

EDIT: Tenga en cuenta también que no es necesario el tubo dentro de los corchetes; los contenidos se tratan como un conjunto de caracteres (o rangos de caracteres), con el o ser implícita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top