Знайсці падрадок ў радку ў C #

У мяне ёсць спіс радкоў фармату:

full1

full1inc1

full1inc2

full1inc3

FULL2

full2inc1

full2inc2

full3

,

,

full100inc100

Basically, the integer value after full can be any number and "inc" may or may not be there,

I have to pick an arbitrary string from this list ,say "full32" or "full32inc1" and isolate the substring "full" along with the number that follows and put it in another string, How am i suppose to do this ? use regex or string matching ??

1
@AmanMehrotra: Пад рэдакцыяй <�б> мой адказ </б> .
дададзена аўтар Tim Schmelter, крыніца
@AmanMehrotra: Пад рэдакцыяй <�б> мой адказ </б> .
дададзена аўтар Tim Schmelter, крыніца
Такім чынам, вы заўсёды хочаце «поўны» + lastNumber , дзе lastNumber толькі апошняя лічбавая частка радка? Вы хочаце, каб прапусціць усе іншыя лікавыя падрадка?
дададзена аўтар Tim Schmelter, крыніца
Такім чынам, вы заўсёды хочаце «поўны» + lastNumber , дзе lastNumber толькі апошняя лічбавая частка радка? Вы хочаце, каб прапусціць усе іншыя лікавыя падрадка?
дададзена аўтар Tim Schmelter, крыніца
Такім чынам, вы заўсёды хочаце «поўны» + lastNumber , дзе lastNumber толькі апошняя лічбавая частка радка? Вы хочаце, каб прапусціць усе іншыя лікавыя падрадка?
дададзена аўтар Tim Schmelter, крыніца
Так што жаданы вынік для full100inc100 ?
дададзена аўтар Tim Schmelter, крыніца
Так што жаданы вынік для full100inc100 ?
дададзена аўтар Tim Schmelter, крыніца
Так што жаданы вынік для full100inc100 ?
дададзена аўтар Tim Schmelter, крыніца
Спрабавалі Ці вы што-небудзь?
дададзена аўтар Soner Gönül, крыніца
Спрабавалі Ці вы што-небудзь?
дададзена аўтар Soner Gönül, крыніца
Спрабавалі Ці вы што-небудзь?
дададзена аўтар Soner Gönül, крыніца
Калі гэта сапраўды «адвольная» радок, то вы можаце выкарыстоўваць «поўны» + (1 + выпадковыя (100));
дададзена аўтар Henk Holterman, крыніца
Калі гэта сапраўды «адвольная» радок, то вы можаце выкарыстоўваць «поўны» + (1 + выпадковыя (100));
дададзена аўтар Henk Holterman, крыніца
Калі гэта сапраўды «адвольная» радок, то вы можаце выкарыстоўваць «поўны» + (1 + выпадковыя (100));
дададзена аўтар Henk Holterman, крыніца
@Aman праверыць гэтае пытанне stackoverflow.com/questions/11905506/ & hellip;
дададзена аўтар Piotr Czarnecki, крыніца
@Aman праверыць гэтае пытанне stackoverflow.com/questions/11905506/ & hellip;
дададзена аўтар Piotr Czarnecki, крыніца
праверыць гэта, магчыма, гэта дапаможа msdn.microsoft. кім/EN-US/бібліятэка/ms228630 (v = vs.80) .aspx
дададзена аўтар Modestas Stankevičius, крыніца
праверыць гэта, магчыма, гэта дапаможа msdn.microsoft. кім/EN-US/бібліятэка/ms228630 (v = vs.80) .aspx
дададзена аўтар Modestas Stankevičius, крыніца
Не, я хачу поўны + numberThatFollows і апусціць астатнюю частку радка. Як я ўжо сказаў, вкл частка можа ці не можа быць у радку. Так праверка змесціва перад вкл не працуе.
дададзена аўтар Aman Mehrotra, крыніца
Не, я хачу поўны + numberThatFollows і апусціць астатнюю частку радка. Як я ўжо сказаў, вкл частка можа ці не можа быць у радку. Так праверка змесціва перад вкл не працуе.
дададзена аўтар Aman Mehrotra, крыніца
Не, я хачу поўны + numberThatFollows і апусціць астатнюю частку радка. Як я ўжо сказаў, вкл частка можа ці не можа быць у радку. Так праверка змесціва перад вкл не працуе.
дададзена аўтар Aman Mehrotra, крыніца
@TimSchmelter: жаданы вынік будзе full100
дададзена аўтар Aman Mehrotra, крыніца
@TimSchmelter: жаданы вынік будзе full100
дададзена аўтар Aman Mehrotra, крыніца
@TimSchmelter: жаданы вынік будзе full100
дададзена аўтар Aman Mehrotra, крыніца

7 адказы

Самы хуткі спосаб будзе грубай сілай, але асабіста, самы просты спосаб я знайшоў бы, каб адпавядаць пэўнаму ўзору, у гэтым выпадку поўны з наступным лікам.

string myString = "full1\nfull2s";//Strings
List listOfStrings = new List();//List of strings
listOfStrings.Add(myString);
Regex regex = new Regex(@"full[0-9]+");//Pattern to look for
StringBuilder sb = new StringBuilder();
foreach(string str in listOfStrings) {
    foreach(Match match in regex.Matches(str)) {//Match patterns
        sb.AppendLine(match.Value);
    }
}

MessageBox.Show(sb.ToString());
1
дададзена

Самы хуткі спосаб будзе грубай сілай, але асабіста, самы просты спосаб я знайшоў бы, каб адпавядаць пэўнаму ўзору, у гэтым выпадку поўны з наступным лікам.

string myString = "full1\nfull2s";//Strings
List listOfStrings = new List();//List of strings
listOfStrings.Add(myString);
Regex regex = new Regex(@"full[0-9]+");//Pattern to look for
StringBuilder sb = new StringBuilder();
foreach(string str in listOfStrings) {
    foreach(Match match in regex.Matches(str)) {//Match patterns
        sb.AppendLine(match.Value);
    }
}

MessageBox.Show(sb.ToString());
1
дададзена

Based on your description, it seems like it might be possible that the strings are not guaranteed to be consistent. The following code will construct a List of delimited (parsed) lines based on an incoming list of unknown content. It's a bit of a "brute force" method, but should allow for flexibility in the incoming list. Here is the code:

List list = new List();
list.Add("full1");
list.Add("full1inc1");
list.Add("full1inc2");
list.Add("full1inc3");
list.Add("full2");
list.Add("full2inc1");
list.Add("full2inc2");
list.Add("full3");
List lines = new List();
foreach (String str in list)
{
    String tmp = String.Empty;
    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();
    foreach (Char ch in str.ToCharArray())
    {
        if (Char.IsLetter(ch))
        {
            if (!String.IsNullOrEmpty(sb2.ToString()))
            {
              tmp += sb2.ToString() + ",";
                sb2 = new StringBuilder();
            }
            sb1.Append(ch);
        }
        else
        {
            if (!String.IsNullOrEmpty(sb1.ToString()))
            {
                tmp += sb1.ToString() + ",";
                sb1 = new StringBuilder();
            }
            sb2.Append(ch);
        }
    }
    if (!String.IsNullOrEmpty(sb1.ToString()))
        tmp += sb1.ToString() + ",";
    if (!String.IsNullOrEmpty(sb2.ToString()))
        tmp += sb2.ToString() + ",";
    lines.Add(tmp);
    for (Int32 i = 0; i < lines.Count; i++)
        lines[i] = lines[i].TrimEnd(',');
}

Такім чынам, грунтуючыся на вашым прыкладзе спіс, вось, што вы атрымаеце:

full1  -->  "full,1"

full1inc1  -->  "full,1,inc,1"

full1inc2  -->  "full,1,inc,2"

full1inc3  -->  "full,1,inc,3"

full2  -->  "full,2"

full2inc1  -->  "full,2,inc,1"

full2inc2  -->  "full,2,inc,2"

full3  -->  "full,3"

full100inc100  -->  "full,100,inc,100"

З дапамогай гэтага метаду, вы не павінны меркаваць, што «поўны» з'яўляецца вядучай радком, ці што за ім ідуць «вкл» (або сапраўды што-небудзь наогул).

Пасля таго як вы атрыманы спіс з абмежавальнікамі, і таму што вы ведаеце, што карціна StringNumberStringNumber , вы можаце выкарыстоўваць любыя сродкі, вы хочаце, каб падзяліць гэтыя размежавання лініі на кавалкі і выкарыстаць іх, як вам падабаецца.

1
дададзена

Based on your description, it seems like it might be possible that the strings are not guaranteed to be consistent. The following code will construct a List of delimited (parsed) lines based on an incoming list of unknown content. It's a bit of a "brute force" method, but should allow for flexibility in the incoming list. Here is the code:

List list = new List();
list.Add("full1");
list.Add("full1inc1");
list.Add("full1inc2");
list.Add("full1inc3");
list.Add("full2");
list.Add("full2inc1");
list.Add("full2inc2");
list.Add("full3");
List lines = new List();
foreach (String str in list)
{
    String tmp = String.Empty;
    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();
    foreach (Char ch in str.ToCharArray())
    {
        if (Char.IsLetter(ch))
        {
            if (!String.IsNullOrEmpty(sb2.ToString()))
            {
              tmp += sb2.ToString() + ",";
                sb2 = new StringBuilder();
            }
            sb1.Append(ch);
        }
        else
        {
            if (!String.IsNullOrEmpty(sb1.ToString()))
            {
                tmp += sb1.ToString() + ",";
                sb1 = new StringBuilder();
            }
            sb2.Append(ch);
        }
    }
    if (!String.IsNullOrEmpty(sb1.ToString()))
        tmp += sb1.ToString() + ",";
    if (!String.IsNullOrEmpty(sb2.ToString()))
        tmp += sb2.ToString() + ",";
    lines.Add(tmp);
    for (Int32 i = 0; i < lines.Count; i++)
        lines[i] = lines[i].TrimEnd(',');
}

Такім чынам, грунтуючыся на вашым прыкладзе спіс, вось, што вы атрымаеце:

full1  -->  "full,1"

full1inc1  -->  "full,1,inc,1"

full1inc2  -->  "full,1,inc,2"

full1inc3  -->  "full,1,inc,3"

full2  -->  "full,2"

full2inc1  -->  "full,2,inc,1"

full2inc2  -->  "full,2,inc,2"

full3  -->  "full,3"

full100inc100  -->  "full,100,inc,100"

З дапамогай гэтага метаду, вы не павінны меркаваць, што «поўны» з'яўляецца вядучай радком, ці што за ім ідуць «вкл» (або сапраўды што-небудзь наогул).

Пасля таго як вы атрыманы спіс з абмежавальнікамі, і таму што вы ведаеце, што карціна StringNumberStringNumber , вы можаце выкарыстоўваць любыя сродкі, вы хочаце, каб падзяліць гэтыя размежавання лініі на кавалкі і выкарыстаць іх, як вам падабаецца.

1
дададзена

У адным радку:

var matches = yourString.Split("\r\n".ToCharArray()).Where(s => s.StartsWith("full32"));

Патрабуецца LINQ, і канцэптуальны эквівалент:

string[] lines = yourString.Split("\r\n".ToCharArray());
List matches = new List();
foreach(string s in lines)
  if(s.StartsWith("full32"))
    matches.Add(s);

Што можа быць больш зручным для чытання для вас.

Калі вы хочаце выкарыстоўваць Regex, нешта падобнае будзе захапіць іх:

Regex r = new Regex("(?full32(inc\d+)?)");
foreach(Match m in r.Matches(yourString))
  MessageBox.Show(m.Groups["f"].Value);

Ва ўсіх гэтых прыкладах, дзе вы бачыце «full32» у радку, гэта значыць, дзе вы павінны параметризовать з зменнай, калі вы хочаце, каб шукаць іншыя, чым full32 радкоў

1
дададзена
Прывітанне, full'32 'Я прадастаўляецца толькі ў якасці прыкладу. Рэальная праблема заключаецца ў тым, што я не ведаю, што цэлае значэнне будзе пасля поўнай. Я атрымліваю гэты радок/імя з імёнаў тэчак, заснаваных на дату карыстач змяшчае ст.
дададзена аўтар Aman Mehrotra, крыніца

У адным радку:

var matches = yourString.Split("\r\n".ToCharArray()).Where(s => s.StartsWith("full32"));

Патрабуецца LINQ, і канцэптуальны эквівалент:

string[] lines = yourString.Split("\r\n".ToCharArray());
List matches = new List();
foreach(string s in lines)
  if(s.StartsWith("full32"))
    matches.Add(s);

Што можа быць больш зручным для чытання для вас.

Калі вы хочаце выкарыстоўваць Regex, нешта падобнае будзе захапіць іх:

Regex r = new Regex("(?full32(inc\d+)?)");
foreach(Match m in r.Matches(yourString))
  MessageBox.Show(m.Groups["f"].Value);

Ва ўсіх гэтых прыкладах, дзе вы бачыце «full32» у радку, гэта значыць, дзе вы павінны параметризовать з зменнай, калі вы хочаце, каб шукаць іншыя, чым full32 радкоў

1
дададзена
Прывітанне, full'32 'Я прадастаўляецца толькі ў якасці прыкладу. Рэальная праблема заключаецца ў тым, што я не ведаю, што цэлае значэнне будзе пасля поўнай. Я атрымліваю гэты радок/імя з імёнаў тэчак, заснаваных на дату карыстач змяшчае ст.
дададзена аўтар Aman Mehrotra, крыніца

Update according to this comment on my question "what's the desired result for full100inc100?"

<�Р> Жаданы вынік будзе full100 </р>

Тады гэта так жа проста, як:

var isolatedList = listOfString
.Select(str => "full" + new string(
    str.Reverse()              //this is a backwards loop in Linq
       .TakeWhile(Char.IsDigit)//this takes chars until there is a non-digit char
       .Reverse()              //backwards loop to pick the digit-chars in the correct order
       .ToArray()              //needed for the string constructor
));

І калі вы хочаце толькі першы нумар пасля «поўнага»:

var isolatedList = listOfString
    .Where(str => str.StartsWith("full"))
    .Select(str => "full" + new string(str.Substring("full".Length)
                                          .TakeWhile(Char.IsDigit)
                                          .ToArray()));

<�моцны> Demo

full1
full1
full2
full3
full2
full1
full2
full3
full100

Магчыма, гэта:

var isolatedList = listOfString
    .Where(str => str.StartsWith("full"))
    .Select(str => "full" + string.Join("_", str.Substring("full".Length).Split(new[]{"inc"}, StringSplitOptions.None)))
    .ToList();

Змяніць падзельнік ў string.join адпаведна або проста выкарыстоўваць логіку без LINQ:

"full" + 
string.Join("_", 
    str.Substring("full".Length).Split(new[]{"inc"}, StringSplitOptions.None))

<�моцны> Demo

full1
full1_1
full1_2
full1_3
full2
full2_1
full2_2
full3
full100_100
1
дададзена
@TimSchmelter, я адправіў свой адказ тут , гэта выглядае прасцей, і я думаю, што лягчэй маніпуляваць без асаблівых ведаў.
дададзена аўтар Bob., крыніца
@TimSchmelter, не было б прасцей у выкарыстанні рэгулярных выразаў для здабывання яго замест радка/маніпуляцыі LINQ, калі ён хоча толькі нумар пасля поўны ?
дададзена аўтар Bob., крыніца
@AmanMehrotra: адрэдагаваць зноў, каб забяспечыць спосаб атрымаць першае чысло пасля «поўнага».
дададзена аўтар Tim Schmelter, крыніца
@Bob.: Так як мае навыкі рэгулярных выразаў ўсё яшчэ слабыя і таму, што метады радковых з'яўляюцца больш эфектыўнымі і Linq часта больш чытэльным я аддаю перавагу гэты шлях. Тым не менш, калі ў вас ёсць простае рэгулярны выраз можа быць лепшым падыходам.
дададзена аўтар Tim Schmelter, крыніца
Я мяркую, каб атрымаць лік, якое варта поўны, а не колькасць у канцы. вкл і лік, якое варта вкл можа ці не можа быць там у радку. Такім чынам, я не магу ізаляваць яго на падставе дадзеных да радка.
дададзена аўтар Aman Mehrotra, крыніца