Подстрока метод indexOf в C#

у меня есть строка, которая выглядит так: "texthere^D123456_02". Но я хочу, чтобы мой результат был D123456.

это то, что я делаю до сих пор:

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

С этим я удаляю по крайней мере _02, однако, если я попробую то же самое для ^ тогда я всегда возвращаюсь texthere, даже когда я использую name.IndexOf("^")

я также пытался только проверить ^, чтобы получить хотя бы результат:D123456_02 но все тот же результат.

я даже пытался name.Replace("^" и затем использовать подстрока, которую я использовал раньше. Но результат остается тем же.

texthere не всегда одинаковой длины, так .Remove() не может быть и речи.

что я делаю не так?

спасибо

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

использовать String.Split способ :

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

или вы можете использовать RegExp для достижения в основном того же самого.


Ну, если вы используете тот же код, который вы опубликовали, он делает правильно, вы начинаете извлекать символы из символа 0 и останавливаетесь, когда он находит"^", поэтому вы получите "texthere".

Если вы хотите только значение, то используйте это:

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

сначала он удалит все, что находится после " _ "и все, что находится до"^".


подстрока принимает позицию и длину, поэтому вам нужно фактически выяснить, где находится ваша позиция курсора и где подчеркивание, чтобы вычислить длину

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);
};  

Регулярные Выражения

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

альтернативой тому, что уже было предложено, является использование regex:

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

использовать regex.

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

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

попробуйте это и дайте мне знать, как она идет

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

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

более простым способом было бы использовать Split

string s = "texthere^D123456_02";

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

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

самым простым решением было бы сначала разделить строку, а затем использовать исходное решение для второй части.

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

после этого вы можете использовать подстроку, как раньше.


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

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

Это разбивает вашу строку на все вхождения _ и ^ и возвращает список строк после разбиения. Поскольку строка, которая вам нужна, D123456 будет в 1-м индексе (т. е. 2-й позиции), я распечатал это.


Если вы просто хотите "d123456" это просто с просто String.Split() больше ничего не нужно. Просто определение индекса, но позже. Есть перегрузки на Split() именно по этой причине.

//...

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

надеюсь, что это помогает.