C # 분할 문자열이지만 분할 문자 / 구분자 유지
이 질문에 이미 답변이 있습니다.
문자열을 세 개의 다른 문자로 분할하고 있지만 출력에 분할 한 문자가 포함되기를 원합니다. 이 작업을 수행하는 쉬운 방법이 있습니까?
분할 문자가 있다면 ,
, .
그리고 ;
, 나는 시도를하려는 :
string[] parts = Regex.Split(originalString, @"(?<=[.,;])")
(?<=PATTERN)
는 PATTERN
. 앞의 텍스트가 맞는 모든 위치에서 PATTERN
일치해야하므로 각 문자 발생 후 일치 (및 분할)가 있어야합니다.
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);
}
}
누군가가이 대답을 원할 경우를 대비해서 ...
대신에 string[] parts = Regex.Split(originalString, @"(?<=[.,;])")
당신이 사용할 수있는 string[] parts = Regex.Split(originalString, @"(?=yourmatch)")
곳 yourmatch
당신의 구분이 무엇이든지이다.
원래 문자열이
777- 고양이
777-개
777-마우스
777-쥐
777-늑대
Regex.Split(originalString, @"(?=777)")
돌아올 것이다
777-고양이
777-개
등등
이것에 대한 많은 답변! 하나는 여러 문자열로 나누기 위해 두 드렸습니다 (원래 답변은 문자 길이, 즉 길이 1). 이것은 완전히 테스트되지 않았습니다.
public static IEnumerable<string> SplitAndKeep(string s, params string[] delims)
{
var rows = new List<string>() { s };
foreach (string delim in delims)//delimiter counter
{
for (int i = 0; i < rows.Count; i++)//row counter
{
int index = rows[i].IndexOf(delim);
if (index > -1
&& rows[i].Length > index + 1)
{
string leftPart = rows[i].Substring(0, index + delim.Length);
string rightPart = rows[i].Substring(index + delim.Length);
rows[i] = leftPart;
rows.Insert(i + 1, rightPart);
}
}
}
return rows;
}
이것은 작동하는 것처럼 보이지만 많이 테스트되지 않았습니다.
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();
}
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;
}
}
}
Iterate through the string character by character (which is what regex does anyway. When you find a splitter, then spin off a substring.
pseudo code
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;
}
}
That's sort of C# but not really. Obviously, choose the appropriate function names. Also, I think there might be an off-by-1 error in there.
But that will do what you're asking.
Regex.Split looks like it might be able to do what you want perhaps.
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());
}
}
}
}
Java code:
public static class String_Ext
{
public static string[] SplitOnGroups(this string str, string pattern)
{
var matches = Regex.Matches(str, pattern);
var partsList = new List<string>();
for (var i = 0; i < matches.Count; i++)
{
var groups = matches[i].Groups;
for (var j = 0; j < groups.Count; j++)
{
var group = groups[j];
partsList.Add(group.Value);
}
}
return partsList.ToArray();
}
}
var parts = "abcde \tfgh\tikj\r\nlmno".SplitOnGroups(@"\s+|\S+");
for (var i = 0; i < parts.Length; i++)
Print(i + "|" + Translate(parts[i]) + "|");
Output:
0|abcde|
1| \t|
2|fgh|
3|\t|
4|ikj|
5|\r\n|
6|lmno|
참고URL : https://stackoverflow.com/questions/521146/c-sharp-split-string-but-keep-split-chars-separators
'developer tip' 카테고리의 다른 글
한 번에 여러 프레임을 부트 스트랩 캐 러셀 (0) | 2020.08.23 |
---|---|
팬더에서 발생 횟수를 계산하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.08.23 |
IIS7 설정 파일 위치 (0) | 2020.08.23 |
셀레늄에서 알려진 요소의 상위 요소 선택 (0) | 2020.08.23 |
MSTest에는 NUnit의 TestCase와 동일한 기능이 있습니까? (0) | 2020.08.22 |