从字符串中删除最后一个特定字符串的出现

17

我有一个字符串,格式如下:

  • RTT(50)
  • RTT(A)(50)
  • RTT(A)(B)(C)(50)

我想从字符串中删除最后一个(),如果字符串是RTT(50),那么我只想返回RTT。如果是RTT(A)(50),则要返回RTT(A)等。

我该如何实现呢?我目前使用的substring方法会去除所有()出现的位置。我考虑使用:

Regex.Matches(node.Text, "( )").Count

要统计出现次数,我做了以下操作。

 if(Regex.Matches(node.Text, "( )").Count > 1)
      //value = node.Text.Remove(Regex.//Substring(1, node.Text.IndexOf(" ("));
 else
     value = node.Text.Substring(0, node.Text.IndexOf(" ("));

else 部分将会按照我的意愿运行。然而,在 if 部分如何移除最后一次出现是我卡住的地方。

6个回答

18
String.LastIndexOf 方法可以满足您的需求 - 返回字符或字符串最后出现的位置。
如果您确信每个字符串至少包含一组括号:
var result = node.Text.Substring(0, node.Text.LastIndexOf("("));

否则,您可以测试 LastIndexOf 的结果:

var lastParenSet = node.Text.LastIndexOf("(");

var result =
    node.Text.Substring(0, lastParenSet > -1 ? lastParenSet : node.Text.Count());

谢谢。不过,如果字符串中没有括号实例会发生什么? - Nuru Salihu

13

这个应该能做到你想要的:

your_string = your_string.Remove(your_string.LastIndexOf(string_to_remove));

就是这么简单。


2

有几个不同的选项需要考虑。

LastIndexOf

获得(字符的最后一个索引,并取出到该索引的子字符串。这种方法的缺点是需要额外检查)的最后一个索引,以确保格式正确,并且它是成对的,即开括号发生在闭括号之后(我没有在下面的代码中执行此检查)。

var index = input.LastIndexOf('(');
if (index >= 0)
{
    var result = input.Substring(0, index);
    Console.WriteLine(result);
}

使用RegexOptions.RightToLeft进行正则表达式

通过使用RegexOptions.RightToLeft,我们可以获取一对括号中的最后一个索引。

var pattern = @"\(.+?\)";
var match = Regex.Match(input, pattern, RegexOptions.RightToLeft);
if (match.Success)
{
    var result = input.Substring(0, match.Index);
    Console.WriteLine(result);
}
else
{
    Console.WriteLine(input);
}

基于数字格式的正则表达式

如果您总是期望最后一个括号内包含数字内容,类似于您的示例值,其中(50)被删除,我们可以使用一种匹配括号内任何数字的模式。

var patternNumeric = @"\(\d+\)";
var result = Regex.Replace(input, patternNumeric, "");
Console.WriteLine(result);

2
非常简单,您可以很容易地实现以下操作:

string a = RTT(50);

string res = a.Substring(0, a.LastIndexOf("("));


1
作为扩展:
namespace CustomExtensions
{
    public static class StringExtension
    {
        public static string ReplaceLastOf(this string str, string fromStr, string toStr)
        {
            int lastIndexOf = str.LastIndexOf(fromStr);
            if (lastIndexOf < 0)
                return str;

            string leading = str.Substring(0, lastIndexOf);
            int charsToEnd = str.Length - (lastIndexOf + fromStr.Length);
            string trailing = str.Substring(lastIndexOf+fromStr.Length, charsToEnd);

            return leading + toStr + trailing;
        }
   }
}

使用:

string myFavColor = "My favourite color is blue";
string newFavColor = myFavColor.ReplaceLastOf("blue", "red");

0

尝试一下这个函数:

public static string ReplaceLastOccurrence(string source, string find, string replace)
{
    int place = source.LastIndexOf(find);
    return source.Remove(place, find.Length).Insert(place, replace);
}

它将删除字符串中的最后一个出现的字符串并替换为另一个,并使用:

string result = ReplaceLastOccurrence(value, "(", string.Empty);

在这种情况下,您可以在value字符串中找到(字符串,并将其替换为string.Empty。它也可以用于替换为其他信息。

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