Это то, что вы хотите получить?
$regTest = (Get-Item 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676'|
Get-ItemProperty).'New Signature'
Если бы символы разделения были ,
, .
, и ;
, то я попробовал бы:
string[] parts = Regex.Split(originalString, @"(?<=[.,;])")
(?<=PATTERN)
положительно, оглядываются для PATTERN
. Это должно соответствовать в любом месте, где предыдущий текст соответствует PATTERN
, таким образом, должно быть соответствие (и разделение) после каждого возникновения любого из символов.
result = originalString.Split(separator);
for(int i = 0; i < result.Length - 1; i++)
result[i] += separator;
( РЕДАКТИРОВАНИЕ - это - плохой ответ - я неправильно читал его вопрос и не видел, что он разделял несколькими символами.)
(РЕДАКТИРОВАНИЕ - корректная версия LINQ является неловкой, так как разделитель не должен быть связан на заключительную строку в массиве разделения.)
Недавно я записал, что дополнительный метод делает к этому:
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;
}
}
}
Выполните итерации через символ строки символом (который является тем, что 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 ошибка.
, Но это сделает то, что Вы спрашиваете.
Regex. Разделение похоже на него, смог делать то, что Вы хотите, возможно.
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());
}
}
}
}
Похоже, что это работает, но мало что проверялось.
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();
}
Исходя из ответа 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);
}
}