Як розділити рядок на розділовий знак із кількома символами на C #?


232

Що робити, якщо я хочу розділити рядок, використовуючи роздільник, який є словом?

Наприклад, This is a sentence.

Я хочу розділитись isі отриматиThis і a sentence.

В Java, я можу відправити в рядку в якості роздільника, але як я можу зробити це в C#?

Відповіді:


281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Приклад із документів:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}

7
Це фактично повертає: 'Th' '' 'речення' із прикладом, наведеним у питанні. Можливо, цього він насправді хоче, але це не те, що він уточнив.
IRBMe

6
Це лише приклад ... Справа в тому: Існує String.Split, який приймає рядки як роздільники.
bruno conde

1
Так, але це не робить те, що вказано в питанні. Ви повинні використовувати щось трохи розумніше, щоб отримати вихід. Тепер, чи є те, що вказане питання насправді те, що бажає запитувач, - це інше питання, але на поставлене тут питання не можна відповісти тривіально лише String.Split.
IRBMe

3
Все ще не зовсім працює. Якщо ви включите пропуски у слово для розділення, вони не включаються у висновок. Якщо вивчити приклад, поданий у запитанні, ви помітите, що вони насправді включають пробіли. Розщеплення на "є" дасть вам "Це" та "речення", а не "Це" та "речення". Зверніть увагу на тонкі пробіли в кінці "Це" та на початку "речення". Знову-таки, ця відповідь, мабуть, те, що насправді хоче запитувач, але це не те, що він запитав, і, повторюю, String.Split не буде тривіально вирішити його.
IRBMe

2
@IRBВи читали питання? 'Я хочу розділитись на "є". Так я отримаю "Це" та "речення" '. Дивіться пробіли в результатах ??? Це саме те, що робить Спліт.
bruno conde

55

Ви можете використовувати метод Regex.Split приблизно так:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Правка : Це задовольняє приклад, який ви подали. Зауважте, що звичайний String.Split також розділиться на " є " в кінці слова "Це", отже, чому я застосував метод Regex і включив межі слова навколо " є ". Однак зауважте, що якщо ви просто написали цей приклад помилково, то String.Split , ймовірно, буде достатньо.


@ EDIT: Я теж не був впевнений, але ви все одно можете використовувати звичайний розділений рядок і просто пробіли з обох сторін, якщо його мета - ТИЛЬКО видалити слово "є".
ahawker

1
Це не працює (принаймні, не докладаючи більше зусиль), тому що ви не знаєте, чи слід пробіл ліворуч, праворуч або обох, не знаючи позицій слова, яке було розділено на рядок .
IRBMe

Здається, надто складно, оскільки String.Splity дозволяє розділити на рядок вже ...
Ed S.

3
Я вже звертався з цим у своїй редакції до своєї відповіді, у коментарі вище та у 3 коментарях до іншої відповіді. String.Split не працює для прикладу, наведеного у питанні. Я не збираюся повторювати себе ще раз, пояснюючи чому. Ви можете прочитати всі інші коментарі, якщо хочете знати.
IRBMe

зауважте, що метод розділення регулярних
виразів

34

Виходячи з існуючих відповідей на цю посаду, це спрощує реалізацію :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}

9
+1, це кричить на метод розширення. Майже нерозумно, що це не одна з вбудованих перевантажень.
Тодд Меньє

9
@ToddMenier Що ви маєте на увазі "майже"?
mwardm

28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

EDIT: «є» доповнюється по обидва боки з пробілами в масиві, щоб зберегти той факт , що ви тільки хочете , слово «буде» вилучений з пропозиції і слова «це» , щоб залишитися незайманими.


8

...Коротко:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);

5

Ви можете використовувати String.Replace (), щоб замінити потрібний розділений рядок символом, який не виникає в рядку, а потім використовувати String.Split на цьому символі, щоб розділити отриману рядок для того ж ефекту.


5

Або використовувати цей код; (те саме: нова рядка [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

Ось функція розширення, щоб зробити розділення за допомогою роздільника рядків:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Приклад використання:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));

19
Перш ніж публікувати код, ви, мабуть, спробуйте спершу запустити його через компілятор, якщо тільки ви не позначаєте, що цього не зробили. У першому рядку відсутня крапка з комою, а str1 та str2 не визначені. Не кажучи вже про те, що код насправді не працює так, як хотіла ОП. Цей код розбиває його на "Th" і "набагато простіше".
мандреко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.