c#
  • regex
  • 2011-12-08 10 views 8 likes 
    8

    Estoy intentando escribir una expresión regular para reescribir las URL para apuntar a un servidor proxy.

    bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr); 
    

    La idea de esta expresión es bastante simple, básicamente encontrar ejemplos de "src = '/" o "src =' //" e introduzca una dirección URL de proxy en ese punto. Esto funciona en general, pero ocasionalmente he encontrado casos donde un "$ 1" literal terminará en la cadena de resultados.

    Esto no tiene sentido para mí porque si no hubiera coincidencia, ¿por qué reemplazaría algo en absoluto?

    Desafortunadamente no puedo dar un ejemplo simple de esto, solo ocurre con cadenas muy grandes hasta ahora, pero me gustaría saber conceptualmente qué podría hacer que suceda esto.

    Como acotación al margen, he intentado reescribir esta expresión utilizando una búsqueda hacia atrás positiva de la siguiente manera:

    bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr); 
    

    Pero esto termina con proxyStr dos veces en la salida si la cadena de entrada contiene "src =" //". Esto tampoco tiene mucho sentido para mí porque pensé que "src =" tendría que estar presente en la entrada dos veces para que proxyStr terminara dos veces en la salida.

    +0

    ¿Podría proporcionar un ejemplo del valor 'proxyStr'? – dasblinkenlight

    +0

    Gracias por la respuesta. ¿Puedes por favor aclarar? No estoy seguro de cómo podría usar un "\ 1" para resolver este problema. Más arriba quise decir que "$ 1" a veces terminará en mi cadena de resultados, como en "... nueva Imagen(). $ 1myproxy/proxy? Url = .....". – Locksleyu

    +0

    proxyStr = "10.15.15.15:8008/proxy?url=http://"; Sin embargo, he visto el segundo problema (varias instancias de proxyStr en el resultado) suceden de manera uniforme incluso con proxyStr = "PROXY". – Locksleyu

    Respuesta

    13

    Cuando proxyStr = "10.15.15.15:8008/proxy?url=http://", la cadena de reemplazo se convierte en "$110.15.15.15:8008/proxy?url=http://". Contiene una referencia al número de grupo 110, que ciertamente no existe.

    Debe asegurarse de que su cadena proxy no se inicie en un dígito. En su caso, usted puede hacerlo por no capturar la última barra, y el cambio de la cadena para "$1/"+proxyStr, así:

    bodystring = Regex.Replace(bodystring, "(src='/*)/", "$1/" + proxyStr); 
    

    Editar:

    Rawling pointed out que las direcciones de la biblioteca de expresiones regulares de .NET este problema: se puede encerrar 1 entre llaves falsas para evitar el aliasing, así:

    bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 
    
    +1

    En lugar de ser descarado y robar una solución adecuada, ya que identificó el problema primero ... vea esta respuesta: http://stackoverflow.com/questions/3466892/regex-replacement-capture-followed-by-digit Básicamente use "$ {1}" en lugar de "$ 1" – Rawling

    +1

    @Rawling ¡Gracias por señalar esto! Sospeché que debe haber una forma legítima de hacerlo, e incluso intenté '($ 1)', pero no encontré la respuesta '$ {1}'. ¡¡¡Gracias!!! – dasblinkenlight

    +1

    ¡Asegúrate de aceptar la respuesta! – Dracorat

    0

    en la segunda versión, supongo proxyStr aparece dos veces porque estás insertando una vez más. Pruebe

    string s2 = Regex.Replace(s, "((?<=src='/+))", proxyStr); 
    
    +0

    Gracias por la idea. Intenté esto y no ayuda. Creo que tengo alguna idea de por qué es reemplazado dos veces, pero lo extraño es que pensé que + era un operador 'codicioso', por lo que si hubiera dos barras diagonales, no coincidiría con una sola. – Locksleyu

    1

    Lo que está haciendo no se puede hacer. .NET tiene problemas al interpolar variables como esta. Su problema es que la cadena de proxy comienza con un número: proxyStr = "10.15.15.15:8008/proxy?url=http://"

    Cuando se combina esto con su $1, la cosa expresión regular que tiene que mirar para retrorreferencia $110 que no existe.

    See what I mean here.

    Usted puede remediar esto, haciendo coincidir otra cosa, o por el juego y la construcción de la cadena de reemplazo manualmente etc. Use lo que más le convenga.

    1

    Basado en dasblinkenlights respuesta (ya 1) la solución es la siguiente:

    bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 
    

    Esto asegura que se utiliza el grupo 1 y no un nuevo número de grupo es construir.

    Cuestiones relacionadas