如何在C#中删除特定的子字符串

6

我有一些C#项目中的文件扩展名,如果它们存在于文件名中,我需要将它们从文件名中删除。

目前我知道我可以检查一个子字符串是否在文件名中。

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

所以如果说 stringValuetest.asm,然后它包含 .asm,我想从 stringValue 中删除 .asm。如何做到这一点?

如果字符串的值是 helloworld,你想要移除 l,那么它是否意味着会移除所有匹配的字符串,输出结果将是 heoword - John Woo
你应该使用 EndsWith(".asm")(或使用 Path.GetExtension)来避免像 "filename.asmo.doc" 这样的边角情况(Contains 在这里会返回错误的结果)。 - Chris Sinclair
4个回答

7

4
如果 anotherStringValue 存在于字符串中的任何位置,即使它不是扩展名,也会导致误判。 - Chris Sinclair
2
可能还需要使用.ToLower()或带有不区分大小写标志的String.Compare来避免任何大小写问题。 - Brad Christie

7

如果你想使用“黑名单”方法并配合 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);
}

已处理的示例:

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

我觉得这是最干净/最好的处理方式,而且很容易添加更多的扩展。谢谢! - Rivasa

6
不需要使用if(),只需使用:
stringValue = stringValue.Replace(anotherStringValue,"");

如果在 stringValue 中没有找到 anotherStringValue,则不会发生任何更改。

2
我强烈建议不要这样做;它将删除所有出现的内容,而不仅仅是扩展名。 - Chris Sinclair
1
至少我会检查 EndsWith(anotherStringValue) 并使用 stringValue.SubString(0, stringValue.Length - anotherStringValue.Length) - Brad Christie

3

另一种一行代码的方法,只删除字符串末尾的".asm"而不删除字符串中间的任何"asm":

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

"$"表示匹配字符串的结尾。
为了匹配".asm"或".ASM"或任何等价物,您可以进一步指定Regex.Replace忽略大小写:
using System.Text.RegularExpresions;
...
stringValue = Regex.Replace(stringValue,".asm$","",RegexOptions.IgnoreCase);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接