2011-03-09 59 views
21

Necesito agregar un número a una referencia inversa mientras realizo una operación de reemplazo.Operaciones matemáticas en expresiones regulares

Ej. Estoy reescribiendo una URL

www.site.com/doc.asp?doc=321 & language = 1

a

www.site.com/headline/100321.article

p.ej haciendo un simple reemplazo pero necesito agregar 100.000 a la id del documento. Lo que tengo a continuación funciona hasta ahora sin agregar nada.

s/.*doc=(\d+).*/www.site.com\/headline\/$1.article/g; 

¿Pero cómo puedo agregar 100,000 a $ 1?

Nota, no se puede simplemente añadir '100' antes del número porque el ID de documento podría ser> 999.

+2

Logré hacer una expresión matemática simple usando la bandera 'e'. s /.* doc = (\ d +). */$ 1 + 100000/e, pero de esa manera solo devuelve el número y no la URL de "envoltura". Necesito concatenar esto con el resto de la cadena. – Kevin

+0

+1 Gracias por esta pregunta. Me ayudó a hacer algo similar con el programa de Linux 'rename'. – Geoff

Respuesta

29

usando Perl:

s/.*doc=(\d+).*/"www.site.com\/headline\/".($1+100000).".article"/e; 

como se ha hecho con la bandera e, la parte derecha se convierte ahora en una expresión. entonces tiene que envolver la parte que no captura como cadenas.

+0

Hacer ¿Sabes si esto funciona en el analizador de expresiones regulares de .Net? – Kevin

+1

@Kevin, no, no. La parte '($ 1 + 100000)' está siendo evaluada por Perl, regex no tiene nada que ver con esto. Pero, parece que ya estás usando Perl, ¿no? –

+2

¡Bonito vudú de Perl!+1 –

5

Eso no es posible en expresiones regulares. Regex solo combina patrones, no hace aritmética.

Lo mejor que puede hacer es algo prolijo como:

match  replace 

(\d{6,}) $1 
(\d{5})  1$1 
(\d{4})  10$1 
(\d{3})  100$1 
(\d{2})  1000$1 
(\d)  10000$1 
+0

¿Sería posible crear una expresión regular que sí haga aritmética? Como uno extremadamente complicado? Sé que estaría lejos de ser la forma más eficiente de hacerlo, pero aún tendría valor como ejercicio técnico. Así es como encontré esta página (a través de una búsqueda de Google relacionada): porque tenía curiosidad si esto era posible o si alguien lo había hecho. – flarn2006

+0

@ flarn2006, no, como dije, la expresión regular solo concuerda con los patrones, no hace aritmética. Regex solo le dirá "sí, el texto coincide con el patrón que proporcionó (o no, no lo hizo)", nada más. –

+0

¿Qué tal hacer una expresión regular que coincida con una declaración aritmética que sea correcta? Al igual que "45 + 6 = 51" coincidiría, pero "38 + 16 = 4" no lo haría. ¿Sería eso posible en teoría? – flarn2006

2

Si sólo tiene un par de artículos que usted podría simplemente la fuerza bruta que

...doc=322 -> www.site.com/headline/100322.article 
...doc=323 -> www.site.com/headline/100323.article 
...doc=324 -> www.site.com/headline/100324.article 
...etc 

matemáticas en expresiones regulares, nos vemos aquí en primer lugar.

Cuestiones relacionadas