2013-07-26 5 views
6

Quindi ho alcune estensioni di file nei miei progetti C# e ho bisogno di rimuoverle dal nome del file se ci sono.Come rimuovere una determinata sottostringa in C#

Finora so che posso controllare se una sottostringa è in un nome file.

if (stringValue.Contains(anotherStringValue)) 
{ 
    // Do Something // 
} 

Quindi, se per esempio stringValue è test.asm, e poi contiene .asm, voglio cancellare in qualche modo il .asm da stringValue.

Come posso fare questo?

+0

cosa succede se il valore della stringa è 'helloworld' e si desidera rimuovere 'L'. significa che rimuoverà tutte le stringhe corrispondenti e l'output sarà 'heoword'? –

+0

Dovresti usare 'EndsWith (". Asm ")' (o usare [Path.GetExtension] (http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx)) per evitare casi angolari come "nomefile.asmo.doc" ('Contains' restituirà un falso positivo qui) –

risposta

7

se si desidera un approccio "lista nera" accoppiata con la libreria Path:

// list of extensions you want removed 
String[] badExtensions = new[]{ ".asm" }; 

// original filename 
String filename = "test.asm"; 

// test if the filename has a bad extension 
if (badExtensions.Contains(Path.GetExtension(filename).ToLower())){ 
    // it does, so remove it 
    filename = Path.GetFileNameWithoutExtension(filename); 
} 

esempi trattati:

test.asm  = test 
image.jpg  = image.jpg 
foo.asm.cs  = foo.asm.cs <-- Note: .Contains() & .Replace() would fail 
+0

Mi sento come se fosse il modo più pulito/più bello di elaborarlo ed è facilmente addizionabile per più estensioni. Grazie! – Annabelle

6

Non c'è bisogno per il caso(), basta usare:

stringValue = stringValue.Replace(anotherStringValue,""); 

se anotherStringValue non viene trovato all'interno stringValue, poi si verificheranno cambiamenti.

+2

Raccomando fortemente contro questo; rimuoverà tutte le occorrenze, non solo l'estensione. –

+1

per lo meno controllerei 'EndsWith (anotherStringValue)' e useremo 'stringValue.SubString (0, stringValue.Length - anotherStringValue.Length)' –

7

È possibile utilizzare Path.GetFileNameWithoutExtension(filepath) per farlo.

if (Path.GetExtension(stringValue) == anotherStringValue) 
{ 
    stringValue = Path.GetFileNameWithoutExtension(stringValue); 
} 
+4

Questo otterrà dei falsi positivi se 'anotherStringValue' esiste ovunque nella stringa, anche se non è l'estensione. –

+1

Grazie per il commento. Hai ragione. Ho modificato il codice – Vasiliy

+2

Probabilmente voglio anche usare '.ToLower()', o 'String.Compare' con un flag insensibile per evitare problemi di CasE. –

3

Un altro approccio one-liner di sbarazzarsi di solo il ".asm" alla fine e non "asm" nel mezzo della stringa:

stringValue = System.Text.RegularExpressions.Regex.Replace(stringValue,".asm$",""); 

Il "$" corrisponde alla fine della stringa.

per corrispondenza ".asm" o ".ASM" o qualsiasi equivlanet, è possibile specificare ulteriormente Regex.Replace di ignorare caso:

using System.Text.RegularExpresions; 
... 
stringValue = Regex.Replace(stringValue,".asm$","",RegexOptions.IgnoreCase);