N 문자마다 문자열에 구분 기호를 추가 하시겠습니까?
이진수를 포함하는 문자열이 있습니다. 8 자리마다 문자열을 구분하는 방법은 무엇입니까?
문자열이 다음과 같다고 가정합니다.
string x = "111111110000000011111111000000001111111100000000";
8 자마다, (쉼표)와 같은 구분 기호를 추가하고 싶습니다.
출력은 다음과 같아야합니다.
"11111111,00000000,11111111,00000000,11111111,00000000,"
그런 다음 목록 <> 마지막 8 자 1 일 다음 이전 8 자 (, 제외) 등으로 보내고 싶습니다.
어떻게 할 수 있습니까?
Regex.Replace(myString, ".{8}", "$0,");
8 자 문자열 배열을 원한다면 다음이 더 쉬울 것입니다.
Regex.Split(myString, "(?<=^(.{8})+)");
여덟 문자의 배수가 앞에 오는 지점에서만 문자열을 분할합니다.
이 시도:
var s = "111111110000000011111111000000001111111100000000";
var list = Enumerable
.Range(0, s.Length/8)
.Select(i => s.Substring(i*8, 8))
.ToList();
var res = string.Join(",", list);
추악하지만 쓰레기는 적습니다.
private string InsertStrings(string s, int insertEvery, char insert)
{
char[] ins = s.ToCharArray();
int length = s.Length + (s.Length / insertEvery);
if (ins.Length % insertEvery == 0)
{
length--;
}
var outs = new char[length];
long di = 0;
long si = 0;
while (si < s.Length - insertEvery)
{
Array.Copy(ins, si, outs, di, insertEvery);
si += insertEvery;
di += insertEvery;
outs[di] = insert;
di ++;
}
Array.Copy(ins, si, outs, di, ins.Length - si);
return new string(outs);
}
문자열 과부하 :
private string InsertStrings(string s, int insertEvery, string insert)
{
char[] ins = s.ToCharArray();
char[] inserts = insert.ToCharArray();
int insertLength = inserts.Length;
int length = s.Length + (s.Length / insertEvery) * insert.Length;
if (ins.Length % insertEvery == 0)
{
length -= insert.Length;
}
var outs = new char[length];
long di = 0;
long si = 0;
while (si < s.Length - insertEvery)
{
Array.Copy(ins, si, outs, di, insertEvery);
si += insertEvery;
di += insertEvery;
Array.Copy(inserts, 0, outs, di, insertLength);
di += insertLength;
}
Array.Copy(ins, si, outs, di, ins.Length - si);
return new string(outs);
}
또 다른 Regex 접근 방식이 있습니다.
var str = "111111110000000011111111000000001111111100000000";
# for .NET 4
var res = String.Join(",",Regex.Matches(str, @"\d{8}").Cast<Match>());
# for .NET 3.5
var res = String.Join(",", Regex.Matches(str, @"\d{8}")
.OfType<Match>()
.Select(m => m.Value).ToArray());
마지막 요구 사항을 올바르게 이해하면 (중간 쉼표로 구분 된 문자열이 필요한지 여부가 명확하지 않음) 다음과 같이 할 수 있습니다.
var enumerable = "111111110000000011111111000000001111111100000000".Batch(8).Reverse();
morelinq 를 활용하여 .
... 또는 구식 :
public static List<string> splitter(string in, out string csv)
{
if (in.length % 8 != 0) throw new ArgumentException("in");
var lst = new List<string>(in/8);
for (int i=0; i < in.length / 8; i++) lst.Add(in.Substring(i*8,8));
csv = string.Join(",", lst); //This we want in input order (I believe)
lst.Reverse(); //As we want list in reverse order (I believe)
return lst;
}
LINQ를 사용하는 한 가지 방법 :
string data = "111111110000000011111111000000001111111100000000";
const int separateOnLength = 8;
string separated = new string(
data.Select((x,i) => i > 0 && i % separateOnLength == 0 ? new [] { ',', x } : new [] { x })
.SelectMany(x => x)
.ToArray()
);
여기 내 두 센트도 있습니다. StringBuilder를 사용한 구현 :
public static string AddChunkSeparator (string str, int chunk_len, char separator)
{
if (str == null || str.Length < chunk_len) {
return str;
}
StringBuilder builder = new StringBuilder();
for (var index = 0; index < str.Length; index += chunk_len) {
builder.Append(str, index, chunk_len);
builder.Append(separator);
}
return builder.ToString();
}
다음과 같이 부를 수 있습니다.
string data = "111111110000000011111111000000001111111100000000";
string output = AddChunkSeparator(data, 8, ',');
이것은 배열을 복사하지 않고 훨씬 더 빠릅니다 (이 버전은 3 자리마다 공백을 삽입하지만 필요에 따라 조정할 수 있음)
public string GetString(double valueField)
{
char[] ins = valueField.ToString().ToCharArray();
int length = ins.Length + (ins.Length / 3);
if (ins.Length % 3 == 0)
{
length--;
}
char[] outs = new char[length];
int i = length - 1;
int j = ins.Length - 1;
int k = 0;
do
{
if (k == 3)
{
outs[i--] = ' ';
k = 0;
}
else
{
outs[i--] = ins[j--];
k++;
}
}
while (i >= 0);
return new string(outs);
}
파티에 조금 늦었지만 입력 문자열 x
을 n
다른 문자열 로 구분 된 그룹으로 나누는 단순화 된 LINQ식이 있습니다 sep
.
string sep = ",";
int n = 8;
string result = String.Join(sep, x.InSetsOf(n).Select(g => new String(g.ToArray())));
여기에서 일어나는 일에 대한 간략한 요약 :
x
int로서 취급되고IEnumberable<char>
를 Where 인InSetsOf
확장 방법에 온다.InSetsOf(n)
그룹 문자에IEnumerable
의IEnumerable
- 외부 그룹에있는 각 항목의 내부 그룹이 포함되어n
문자.- Inside the
Select
method, each group ofn
characters is turned back into a string by using theString()
constructor that takes an array ofchars
. - The result of
Select
is now anIEnumerable<string>
, which is passed intoString.Join
to interleave thesep
string, just like any other example.
I did it using Pattern & Matcher as following way:
fun addAnyCharacter(input: String, insertion: String, interval: Int): String {
val pattern = Pattern.compile("(.{$interval})", Pattern.DOTALL)
val matcher = pattern.matcher(input)
return matcher.replaceAll("$1$insertion")
}
Where:
input
indicates Input string. Check results section.
insertion
indicates Insert string between those characters. For example comma (,), start(*), hash(#).
interval
indicates at which interval you want to add insertion character.
input
indicates Input string. Check results section. Check results section; here I've added insertion at every 4th character.
Results:
I/P: 1234XXXXXXXX5678 O/P: 1234 XXXX XXXX 5678
I/P: 1234567812345678 O/P: 1234 5678 1234 5678
I/P: ABCDEFGHIJKLMNOP O/P: ABCD EFGH IJKL MNOP
Hope this helps.
I am more than late with my answer but you can use this one:
static string PutLineBreak(string str, int split)
{
for (int a = 1; a <= str.Length; a++)
{
if (a % split == 0)
str = str.Insert(a, "\n");
}
return str;
}
For every 1 character, you could do this one-liner:
string.Join(".", "1234".ToArray()) //result: 1.2.3.4
참고URL : https://stackoverflow.com/questions/9932096/add-separator-to-string-at-every-n-characters
'IT Share you' 카테고리의 다른 글
C #에는 Java와 같은 String Tokenizer가 있습니까? (0) | 2020.11.16 |
---|---|
PHP fileinfo는 정의되지 않은 함수입니다. (0) | 2020.11.16 |
Nginx를 통한 EventSource / 서버 전송 이벤트 (0) | 2020.11.16 |
Python에서 Selenium WebDriver로 부분 스크린 샷을 찍는 방법은 무엇입니까? (0) | 2020.11.16 |
bootstrap-datepicker로 선택한 날짜에 대한 변경 감지 (0) | 2020.11.16 |