Ecco un po' di analisi sulla regular che ti ho passato...
analizzando: (name="FK_ID".*)dataType="i2"
() Le parentesi servono a creare un gruppo numerato di match, che può poi essere letto separatamente da tutto il contesto in match, in altre parole serve ad estrapolare una parte di match, quella che a volte ci interessa rispetto ad un match più ampio.
(?<NomeGruppo>) Esistono anche i named group, sono come i precedenti, solo che è possibile dare un nome al gruppo, e successivamente trovare tale gruppo usando un nome come chiave invece che l'indice.
. Il punto prende (quasi) qualsiasi carattere, e ti invito a leggere il mio post: http://blogs.dotnethell.it/Regulator/RegEx-Il-punto-prende-quasi-qualsiasi-carattere__13264.aspx
* E' un token di ripetizione, e vuol dire prendi 0 o più volte il carattere, set o gruppo che precede. Quindi .* vuol dire prendi qualsiasi carattere e non ti fermare se non ce ne dovessero essere.
+ Anche il più è un token di ripetizione, e vuol dire prendi 1 o più volte il carattere, set o gruppo che precede. Quindi la differenza tra .* e .+ è che con il più, il match fallirebbe se non ci fosse alcun carattere da prendere.
Tutto il resto dei caratteri name="FK_ID" e dataType="i2" sono literal token per il motore regex. Un token è un carattere o più a formare una regola per il motore, i più semplici sono i literal e cioè appunto qualsiasi cosa che non sia un carattere speciale, quindi name="FK_ID" ecc... sono visti come semplici caratteri che devono essere presenti nella posizione corretta nella stringa sorgente su cui si sta effettuando la ricerca.
invece analizzando l'espressione di replace: ${1}dataType="i4"
${} rappresenta il match del solo gruppo numerato 1 (il gruppo 0 contiene tutto il match completo!)
${NomeGruppo} questa è l'alternativa al precedente, se invece tu avessi un named group al posto del numbered group (?<NomeGruppo>.*)
ATTENZIONE perchè regex non viene sempre implementato utilizzando lo standard IEEE POSIX (http://en.wikipedia.org/wiki/Regular_expression#Standards), e quindi a volte certi caratteri speciali possono differire tra motore e motore. Specialmente quando si parla di replace, dove non credo sia proprio definito uno standard, semplicemente il più dei linguaggi cerca di avere uno standard in comune.
Puoi fare un po' di pratica sfruttando qualche strumento per la compilazione e l'esecuzione di regular expression, vedi il mio post per un elenco completo: http://blogs.dotnethell.it/Regulator/RegEx-Software-per-testare-le-vostre-Regular-Expression__10902.aspx
Anche quelli online sono veramente comodi e fatti bene, come http://www.regexr.com/ oppure http://regex101.com/
Per me il migliore in assoluto per desktop è RegexBuddy (30 euro spesi benissimo!) ha anche il debugger!!
Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic