Использовать string.Split.
string text = "Bitcoin ATMs Highlight Flaws in EU Money Laundering Rules";
string searchtext = "Money Laundering Rules";
string[] fragments = text.Split(new string[] { searchtext }, StringSplitOptions.None);
fragments
будет равно:
[0] "Bitcoin ATMs Highlight Flaws in EU "
[1] ""
Везде, где есть разрыв между последовательными элементами массива, появляется строка поиска. Например:
string originaltext = string.Join(searchtext, fragments);
Расширенное описание поведения String.Split
Вот краткая таблица поведения string.Split при передаче строки.
| Input | Split | Result Array |
+--------+-------+--------------------+
| "ABC" | "A" | { "", "BC" } |
| "ABC" | "B" | { "A", "C" } |
| "ABC" | "C" | { "AB", "" } |
| "ABC" | "D" | { "ABC" } |
| "ABC" | "ABC" | { "", "" } |
| "ABBA" | "A" | { "", "BB", "" } |
| "ABBA" | "B" | { "A", "", "A" } |
| "AAA" | "A" | { "", "", "", "" } |
| "AAA" | "AA" | { "", "A" } |
Если вы посмотрите на таблицу выше, каждое место, где в массиве была запятая (между двумя последовательными элементами в массиве), это место, где была найдена разделенная строка.
Если строка не была найдена, тогда в массиве результатов будет только один элемент (исходная строка).
Если в начале входной строки находится разделенная строка, то в качестве первого элемента массива результатов будет задана пустая строка. начало строки. Аналогично, если в конце строки найдена разделенная строка, в качестве последнего элемента массива результатов устанавливается пустая строка.
Кроме того, пустая строка включается между любыми последовательными вхождениями строки поиска. во входной строке.
В тех случаях, когда есть неоднозначные перекрывающиеся местоположения, в которых строка может быть найдена во входной строке: (например, разделение AAA
на AA
может быть разделено как AA
| A
или A
| AA
- где AA
находится в позиции 0 или позиции 1 во входной строке), затем используется местоположение ранее . (например, AA
| A
, что приводит к { "", "A" }
).
Опять же, инвариант заключается в том, что исходную строку всегда можно восстановить, соединив все фрагменты и поместив ровно одно вхождение искомого текста между элементами. Следующее всегда будет истинным:
string.Join(searchtext, fragments) == text
Если вы хотите только первое разделение ...
Вы можете объединить все результаты после первого объединения вместе, как это :
if (fragments.Length > 1) {
fragments = new string[] { fragments[0], string.Join(searchtext, fragments.Skip(1)) };
}
... или более эффективный способ, используя String.IndexOf
Если вы просто хотите найти первое место текстовой строки поиска, используйте String.IndexOf
, чтобы получить позиция первого вхождения искомого текста во входной строке.
Вот полная функция, которую вы можете использовать
private static bool TrySplitOnce(string text, string searchtext, out string beforetext, out string aftertext)
{
int pos = text.IndexOf(searchtext);
if (pos < 0) {
// not found
beforetext = null;
aftertext = null;
return false;
} else {
// found at position `pos`
beforetext = text.Substring(0, pos); // may be ""
aftertext = text.Substring(pos + searchtext.Length); // may be ""
return true;
}
}
Вы можете использовать ее для создания массива, если хотите.
использование:
string text = "red or white or blue";
string searchtext = "or";
if (TrySplitOnce(text, searchtext, out string before, out string after)) {
Console.WriteLine("{0}*{1}", before, after);
// output:
// red * white or blue
string[] array = new string[] { before, searchtext, after };
// array == { "red ", "or", " white or blue" };
Console.WriteLine(string.Join("|", array));
// output:
// red |or| white or blue
} else {
Console.WriteLine("Not found");
}
выход:
red * white or blue
red |or| white or blue