Разделение C# представляет в виде строки, но сохраняет разделенные символы / разделители [дубликат]

Это то, что вы хотите получить?

$regTest = (Get-Item 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676'|
 Get-ItemProperty).'New Signature'
99
задан 11 April 2011 в 17:57
поделиться

8 ответов

Если бы символы разделения были ,, ., и ;, то я попробовал бы:

string[] parts = Regex.Split(originalString, @"(?<=[.,;])")

(?<=PATTERN) положительно, оглядываются для PATTERN. Это должно соответствовать в любом месте, где предыдущий текст соответствует PATTERN, таким образом, должно быть соответствие (и разделение) после каждого возникновения любого из символов.

151
ответ дан that_roy 24 November 2019 в 05:02
поделиться
result = originalString.Split(separator);
for(int i = 0; i < result.Length - 1; i++)
    result[i] += separator;

( РЕДАКТИРОВАНИЕ - это - плохой ответ - я неправильно читал его вопрос и не видел, что он разделял несколькими символами.)

(РЕДАКТИРОВАНИЕ - корректная версия LINQ является неловкой, так как разделитель не должен быть связан на заключительную строку в массиве разделения.)

1
ответ дан mqp 24 November 2019 в 05:02
поделиться

Недавно я записал, что дополнительный метод делает к этому:

public static class StringExtensions
    {
        public static IEnumerable<string> SplitAndKeep(this string s, string seperator)
        {
            string[] obj = s.Split(new string[] { seperator }, StringSplitOptions.None);

            for (int i = 0; i < obj.Length; i++)
            {
                string result = i == obj.Length - 1 ? obj[i] : obj[i] + seperator;
                yield return result;
            }
        }
    }
1
ответ дан BFree 24 November 2019 в 05:02
поделиться

Выполните итерации через символ строки символом (который является тем, что regex делает так или иначе. Когда Вы находите разделитель, затем отделяете подстроку.

псевдо код

int hold, counter;
List<String> afterSplit;
string toSplit

for(hold = 0, counter = 0; counter < toSplit.Length; counter++)
{
   if(toSplit[counter] = /*split charaters*/)
   {
      afterSplit.Add(toSplit.Substring(hold, counter));
      hold = counter;
   }
}

Это - вид C#, но не действительно. Очевидно, выберите соответствующие имена функций. Кроме того, я думаю, что там могла бы быть off-1 ошибка.

, Но это сделает то, что Вы спрашиваете.

1
ответ дан DevinB 24 November 2019 в 05:02
поделиться

Regex. Разделение похоже на него, смог делать то, что Вы хотите, возможно.

0
ответ дан Garry Shutler 24 November 2019 в 05:02
поделиться
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = @"This;is:a.test";
            char sep0 = ';', sep1 = ':', sep2 = '.';
            string pattern = string.Format("[{0}{1}{2}]|[^{0}{1}{2}]+", sep0, sep1, sep2);
            Regex regex = new Regex(pattern);
            MatchCollection matches = regex.Matches(input);
            List<string> parts=new List<string>();
            foreach (Match match in matches)
            {
                parts.Add(match.ToString());
            }
        }
    }
}
0
ответ дан Øyvind Skaar 24 November 2019 в 05:02
поделиться

Похоже, что это работает, но мало что проверялось.

public static string[] SplitAndKeepSeparators(string value, char[] separators, StringSplitOptions splitOptions)
{
    List<string> splitValues = new List<string>();
    int itemStart = 0;
    for (int pos = 0; pos < value.Length; pos++)
    {
        for (int sepIndex = 0; sepIndex < separators.Length; sepIndex++)
        {
            if (separators[sepIndex] == value[pos])
            {
                // add the section of string before the separator 
                // (unless its empty and we are discarding empty sections)
                if (itemStart != pos || splitOptions == StringSplitOptions.None)
                {
                    splitValues.Add(value.Substring(itemStart, pos - itemStart));
                }
                itemStart = pos + 1;

                // add the separator
                splitValues.Add(separators[sepIndex].ToString());
                break;
            }
        }
    }

    // add anything after the final separator 
    // (unless its empty and we are discarding empty sections)
    if (itemStart != value.Length || splitOptions == StringSplitOptions.None)
    {
        splitValues.Add(value.Substring(itemStart, value.Length - itemStart));
    }

    return splitValues.ToArray();
}
3
ответ дан 24 November 2019 в 05:02
поделиться

Исходя из ответа BFree, у меня была та же цель, но я хотел разбить массив символов, аналогичный исходному методу Split, и у меня также есть несколько разделений на строку:

public static IEnumerable<string> SplitAndKeep(this string s, char[] delims)
{
    int start = 0, index;

    while ((index = s.IndexOfAny(delims, start)) != -1)
    {
        if(index-start > 0)
            yield return s.Substring(start, index - start);
        yield return s.Substring(index, 1);
        start = index + 1;
    }

    if (start < s.Length)
    {
        yield return s.Substring(start);
    }
}
24
ответ дан 24 November 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: