C#中的子字符串IndexOf

11

我有一个字符串,看起来像这样:"texthere^D123456_02"。但我想要的结果是D123456

目前我已经做了这些:

if (name.Contains("_"))
{
name = name.Substring(0, name.LastIndexOf('_'));
}

通过这种方式,我至少移除了_02,但是如果我尝试同样的方法对^进行操作,那么无论我是否使用name.IndexOf("^")都会得到texthere

我还尝试仅检查^,以至少获得结果:D123456_02,但结果仍然相同。

我甚至尝试过name.Replace("^",然后再使用之前使用的子字符串方式。但是结果仍然保持不变。

texthere的长度并不总是相同,因此.Remove()不可行。

我做错了什么?

谢谢







































3
你可以以 ^ 字符为分隔符,只取第二部分。但我认为更好的选择是使用正则表达式。 - Matthijs
13个回答

13

调用 Substring 方法时,应该从找到的索引开始,而不是从索引0开始:

  String name = "texthere^D123456_02";

  int indexTo = name.LastIndexOf('_');

  if (indexTo < 0)
    indexTo = name.Length;

  int indexFrom = name.LastIndexOf('^', indexTo - 1);

  if (indexFrom >= 0)
    name = name.Substring(indexFrom + 1, indexTo - indexFrom - 1);

虽然更复杂,但这是唯一不会创建不必要和临时字符串的方法。 - Steve

7
string s = "texthere^D123456_02";
            string result= s.Substring(s.IndexOf("^") + 1);//Remove all before
            result = result.Remove(result.IndexOf("_"));//Remove all after

5
使用 String.Split 方法:
    var split1 = name.Split('^')[1];
    var yourText = split1.Split('_')[0];

或者你可以使用RegExp来实现基本相同的功能。

4
您最简单的解决方案是先分割字符串,然后使用您原来的解决方案处理第二部分。
string name = "texthere^D123456_02";
string secondPart = name.Split('^')[1]; // This will be D123456_02

之后,您可以像以前一样使用子字符串。

4

使用正则表达式

 string s = "texthere^D123456_02";
 Regex r1 = new Regex(@"\^(.*)_");
 MatchCollection mc = r1.Matches(s);
 Console.WriteLine("Result is " + mc[0].Groups[1].Value);

你确定这个答案吗? - Green Falcon

4

使用正则表达式。

Regex regex = new Regex(@"\^(.*)_");
Match match = regex.Match(name);

if(match.Success)
{
    name= match.Groups[1].Value
}

4

除了已经提出的方案,还有一种方法是使用正则表达式:

string result = Regex.Match("texthere^D123456_02", @"\^(.*)_").Groups[1].Value; // D123456

3

子字符串函数需要输入一个起始位置和一个长度参数,因此您需要确定插入符的位置以及下划线所在的位置来计算长度。

var name = "texthere^D123456_02";

if(name.Contains('_'))
{
    var caretPos = name.IndexOf('^') + 1; // skip ahead
    var underscorePos = name.IndexOf('_');
    var length = underscorePos - caretPos;
    var substring = name.Substring(caretPos, length);
    Debug.Print(substring);
};  

3
试试这个,让我知道它的效果如何。
  string inputtext = "texthere^D123456_02";
  string pattern = @".+\^([A-Z]+[0-9]+)\_[0-9]+";

  string result = Regex.Match(inputtext, pattern).Groups[1].Value;

1
Groups[0] 返回整个匹配,应该是 Groups[1]。 - nkoniishvt

3
更简单的方法是使用Split函数。
string s = "texthere^D123456_02";

string[] a = s.Split('^', '_');

if (a.Length == 3) // correct
{
}

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