c#中的子串IndexOf

时间:2016-03-04 08:18:32

标签: c# substring

我有一个如下所示的字符串:"texthere^D123456_02"。但我希望我的结果为D123456

这是我到目前为止所做的:

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

有了这个,我至少删除了_02,但如果我对^采用相同的方式,那么即使我使用texthere <我也总是回到name.IndexOf("^") / p>

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

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

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

我做错了什么?

由于

13 个答案:

答案 0 :(得分:8)

致电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);

答案 1 :(得分:3)

使用String.Split方法:

    var split1 = name.Split('^')[1];
    var yourText = split1.Split('_')[0];

或者您可以使用RegExp实现基本相同。

答案 2 :(得分:3)

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

答案 3 :(得分:3)

好吧,如果你使用你发布的相同代码,它正在做正确的事情,你开始从char 0中检索字符并在找到“^”时停止,所以你得到的是“texthere”。

如果您只想要这个值,请使用:

name = name.Substring(0, name.LastIndexOf('_')).Substring(name.IndexOf("^") + 1);

首先删除“_”之后的任何内容以及“^”之前的内容。

答案 4 :(得分: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);
};  

答案 5 :(得分:3)

使用正则表达式

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

答案 6 :(得分:3)

使用正则表达式。

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

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

答案 7 :(得分:3)

已经建议的替代方法是使用正则表达式:

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

答案 8 :(得分:3)

试试这个让我知道它是怎么回事

  string inputtext = "texthere^D123456_02";
  string pattern = @".+\^([A-Z]+[0-9]+)\_[0-9]+";

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

答案 9 :(得分:2)

更简单的方法是使用Split

string s = "texthere^D123456_02";

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

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

答案 10 :(得分:2)

最简单的解决方案是首先拆分字符串,然后将原始解决方案用于第二部分。

string name = "texthere^D123456_02";
string secondPart = name.Split('^')[1]; // This will be D123456_02

之后您可以像以前一样使用Substring。

答案 11 :(得分:2)

String name = "texthere^D123456_02"
    print name.split('_', '^')[1]

这会在所有出现的_和^时拆分字符串,并在拆分后返回字符串列表。由于您需要D123456的字符串将位于第一个索引处(即第二个位置),我已打印出该字符串。

答案 12 :(得分:2)

如果你只是想要&#34; d123456&#34;只有String.Split()它很简单,不需要任何其他东西。只需定义您想要的索引。由于这个原因,Split()上存在重载。

//...

var source = "texthere^D123456_02";
var result = source.Split(new char[] {'^', '_'}, StringSplitOptions.RemoveEmptyEntries)[1];
Console.WriteLine(result);
//Outputs: "D123456"

希望这有帮助。