Подстрока метод 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"
надеюсь, что это помогает.