If he has 100k tracks that would mean (according to my not very scientific estimates based on my library) ~2000-2500 artists. I just ran through slightly more than that spotting for mistakes in maybe 5 minutes, but's let's say 10, and most certainly not more than half an hour. It's fairly quick to spot duplicates when they largely look the same with tiny bits changed (you might not even have to read the text half the time, just squint for things that look similar). So I think manual checking in this case is well within the realms of feasibility. Doing that or a batch script largely depends on whether the person cares about that 1-5%, and that is something he showed interest in.
In either case he could also do some preliminary testing by gathering the tracks that would be affected by your script and comparing the results. This is something I always do if there's mass tagging involved. '<Right click on tracks>/Properties/Tools/Automatically fill values' and I'm guessing masstagger both provide similar previews, but I prefer to do it this way when trying to weed out false positives.
Create an autoplaylist such as this:
"$if($strcmp(<ORIGINAL STRING>,<CHANGES TO BE MADE>),1,0)" IS 0
For example:
"$if($strcmp(%artist%,$replace(%artist%, Iii, III, Iv, IV, Ii, II, Viii, VIII, Vii, VII, Ix, IX, Vi., VI., Of , of , The , the , In , in , A , a , An , an , And , and ,.a,.A,.b,.B,.c,.C,.d,.D,.e,.E,.f,.F,.g,.G,.h,.H,.i,.I,.j,.J,.k,.K,.l,.L,.m,.M,.n,.N,.o,.O,.p,.P,.q,.Q,.r,.R,.s,.S,.t,.T,.u,.U,.v,.V,.w,.W,.x,.X,.y,.Y,.z,.Z,-a,-A,-b,-B,-c,-C,-d,-D,-e,-E,-f,-F,-g,-G,-h,-H,-i,-I,-j,-J,-k,-K,-l,-L,-m,-M,-n,-N,-o,-O,-p,-P,-q,-Q,-r,-R,-s,-S,-t,-T,-u,-U,-v,-V,-w,-W,-x,-X,-y,-Y,-z,-Z, $char(39)a, $char(39)A, $char(39)b, $char(39)B, $char(39)c, $char(39)C, $char(39)d, $char(39)D, $char(39)e, $char(39)E, $char(39)f, $char(39)F, $char(39)g, $char(39)G, $char(39)h, $char(39)H, $char(39)i, $char(39)I, $char(39)j, $char(39)J, $char(39)k, $char(39)K, $char(39)l, $char(39)L, $char(39)m, $char(39)M, $char(39)n, $char(39)N, $char(39)o, $char(39)O, $char(39)p, $char(39)P, $char(39)q, $char(39)Q, $char(39)r, $char(39)R, $char(39)s, $char(39)S, $char(39)t, $char(39)T, $char(39)u, $char(39)U, $char(39)v, $char(39)V, $char(39)w, $char(39)W, $char(39)x, $char(39)X, $char(39)y, $char(39)Y, $char(39)z, $char(39)Z)),1,0)" IS 0
Then temporarily add a column to your playlist viewer to compare the results:
<ORIGINAL STRING> -- <CHANGES TO BE MADE>
For example:
%artist% -- $replace(%artist%, Iii, III, Iv, IV, Ii, II, Viii, VIII, Vii, VII, Ix, IX, Vi., VI., Of , of , The , the , In , in , A , a , An , an , And , and ,.a,.A,.b,.B,.c,.C,.d,.D,.e,.E,.f,.F,.g,.G,.h,.H,.i,.I,.j,.J,.k,.K,.l,.L,.m,.M,.n,.N,.o,.O,.p,.P,.q,.Q,.r,.R,.s,.S,.t,.T,.u,.U,.v,.V,.w,.W,.x,.X,.y,.Y,.z,.Z,-a,-A,-b,-B,-c,-C,-d,-D,-e,-E,-f,-F,-g,-G,-h,-H,-i,-I,-j,-J,-k,-K,-l,-L,-m,-M,-n,-N,-o,-O,-p,-P,-q,-Q,-r,-R,-s,-S,-t,-T,-u,-U,-v,-V,-w,-W,-x,-X,-y,-Y,-z,-Z, $char(39)a, $char(39)A, $char(39)b, $char(39)B, $char(39)c, $char(39)C, $char(39)d, $char(39)D, $char(39)e, $char(39)E, $char(39)f, $char(39)F, $char(39)g, $char(39)G, $char(39)h, $char(39)H, $char(39)i, $char(39)I, $char(39)j, $char(39)J, $char(39)k, $char(39)K, $char(39)l, $char(39)L, $char(39)m, $char(39)M, $char(39)n, $char(39)N, $char(39)o, $char(39)O, $char(39)p, $char(39)P, $char(39)q, $char(39)Q, $char(39)r, $char(39)R, $char(39)s, $char(39)S, $char(39)t, $char(39)T, $char(39)u, $char(39)U, $char(39)v, $char(39)V, $char(39)w, $char(39)W, $char(39)x, $char(39)X, $char(39)y, $char(39)Y, $char(39)z, $char(39)Z)
This will give you a nice preview of all tracks affected and in what way, you can also copy the contents of the autoplaylist to a regular playlist to be able to remove false positives as you look through them. When you feel only the relevant tracks are remaining, you can apply the actual operation.
(If someone is wondering, in my case 2% of tracks would be affected.)