Як на самой справе разбіць радок у радок масіва без страты яго частку ў C #?

<�Моцны> Што ў мяне ёсць

string ImageRegPattern = @"http://[\w\.\/]*\.jpg|http://[\w\.\/]*\.png|http://[\w\.\/]*\.gif";
string a ="http://www.dsa.com/asd/jpg/good.jpgThis is a good dayhttp://www.a.com/b.pngWe are the Best friendshttp://www.c.com";

<�Моцны> Тое, што я хачу

string[] s;
s[0] = "http://www.dsa.com/asd/jpg/good.jpg";
s[1] = "This is a good day";
s[2] = "http://www.a.com/b.png";
s[3] = "We are the Best friendshttp://www.c.com";

Bouns:
    калі URL можа быць расшчапляецца, як паказана ніжэй, гэта будзе лепш, але калі няма, то гэта нармальна.

s[3] = "We are the Best friends";
s[4] = "http://www.c.com";

What's the question
I try to use the code below to split the string,

string[] s= Regex.Split(sourceString, ImageRegPattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

Але вынік не добра, гэта здаецца, што метад Split вымае ўсе радкі, якія адпавядалі ImageRegPattern. Але я хачу, каб яны засталіся. Я правяраю старонку RegEx на MSDN, здаецца, няма правільнага метаду, каб задаволіць сваю патрэбу. Так, як гэта зрабіць?

4
Я не думаю, што ёсць якое-небудзь агульнае рашэнне, каб падзяліць гэты радок (што вы маглі б выпрацаваць нейкі спосаб зрабіць гэта, але гэта будзе даволі адмыслова). Вы нічога не атрымаеце назад ад RegEx, таму што гэта расшчапленне на запалках. Асабіста я б змяніць фармат радкі, калі не добрая прычына не вам трэба проста дадаць падзельнік радка.
дададзена аўтар evanmcdonnal, крыніца
Я не думаю, што ёсць якое-небудзь агульнае рашэнне, каб падзяліць гэты радок (што вы маглі б выпрацаваць нейкі спосаб зрабіць гэта, але гэта будзе даволі адмыслова). Вы нічога не атрымаеце назад ад RegEx, таму што гэта расшчапленне на запалках. Асабіста я б змяніць фармат радкі, калі не добрая прычына не вам трэба проста дадаць падзельнік радка.
дададзена аўтар evanmcdonnal, крыніца
Улічваючы коскі спіс, Regex.Split ( "1,2,3", ",") вяртае масіў [ "1", "2", "3"] . Ўзор вы ставіце вызначае падзельнік, а не тое, што вы хочаце захаваць. <�Код> Regex.Split гэта не тое, што вы хочаце выкарыстоўваць тут. Вы спрабуеце перанесці ваш тэкст і падзельнікі, якія не тое, што Split робіць.
дададзена аўтар Jim Mischel, крыніца
Улічваючы коскі спіс, Regex.Split ( "1,2,3", ",") вяртае масіў [ "1", "2", "3"] . Ўзор вы ставіце вызначае падзельнік, а не тое, што вы хочаце захаваць. <�Код> Regex.Split гэта не тое, што вы хочаце выкарыстоўваць тут. Вы спрабуеце перанесці ваш тэкст і падзельнікі, якія не тое, што Split робіць.
дададзена аўтар Jim Mischel, крыніца

7 адказы

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

UPDATE: Added conditional to handle if no matches are found.

private static IEnumerable InclusiveSplit
(
    string source, 
    string pattern
)
{
  List parts = new List();
  int currIndex = 0;

 //First, find all the matches. These are your separators.
  MatchCollection matches = 
      Regex.Matches(source, pattern, 
      RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

 //If there are no matches, there's nothing to split, so just return a
 //collection with just the source string in it.
  if (matches.Count < 1)
  {
    parts.Add(source);
  }
  else
  {
    foreach (Match match in matches)
    {
     //If the match begins after our current index, we need to add the
     //portion of the source string between the last match and the 
     //current match.
      if (match.Index > currIndex)
      {
        parts.Add(source.Substring(currIndex, match.Index - currIndex));
      }

     //Add the matched value, of course, to make the split inclusive.
      parts.Add(match.Value);

     //Update the current index so we know if the next match has an
     //unmatched substring before it.
      currIndex = match.Index + match.Length;
    }

   //Finally, check is there is a bit of unmatched string at the end of the 
   //source string.
    if (currIndex < source.Length)
      parts.Add(source.Substring(currIndex));
  }

  return parts;
}

Выхад для прыкладу уводу будзе выглядаць прыкладна так:

[0] "http://www.dsa.com/asd/jpg/good.jpg"
[1] "This is a good day"
[2] "http://www.a.com/b.png"
[3] "We are the Best friendshttp://www.c.com"
4
дададзена
Сапраўды дзякуй !!
дададзена аўтар Albert Gao, крыніца

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

UPDATE: Added conditional to handle if no matches are found.

private static IEnumerable InclusiveSplit
(
    string source, 
    string pattern
)
{
  List parts = new List();
  int currIndex = 0;

 //First, find all the matches. These are your separators.
  MatchCollection matches = 
      Regex.Matches(source, pattern, 
      RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

 //If there are no matches, there's nothing to split, so just return a
 //collection with just the source string in it.
  if (matches.Count < 1)
  {
    parts.Add(source);
  }
  else
  {
    foreach (Match match in matches)
    {
     //If the match begins after our current index, we need to add the
     //portion of the source string between the last match and the 
     //current match.
      if (match.Index > currIndex)
      {
        parts.Add(source.Substring(currIndex, match.Index - currIndex));
      }

     //Add the matched value, of course, to make the split inclusive.
      parts.Add(match.Value);

     //Update the current index so we know if the next match has an
     //unmatched substring before it.
      currIndex = match.Index + match.Length;
    }

   //Finally, check is there is a bit of unmatched string at the end of the 
   //source string.
    if (currIndex < source.Length)
      parts.Add(source.Substring(currIndex));
  }

  return parts;
}

Выхад для прыкладу уводу будзе выглядаць прыкладна так:

[0] "http://www.dsa.com/asd/jpg/good.jpg"
[1] "This is a good day"
[2] "http://www.a.com/b.png"
[3] "We are the Best friendshttp://www.c.com"
4
дададзена
Сапраўды дзякуй !!
дададзена аўтар Albert Gao, крыніца

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

string ImageRegPattern = @"(?=(http://[\w./]*?\.jpg|http://[\w./]*?\.png|http://[\w./]*?\.gif))|(?<=(\.jpg|\.png|\.gif))"

Гэта будзе адпавядаць любым пункце ў радку, альбо якое суправаджаецца URL малюнка, або пункту, якая папярэднічае па .jpg , .gif або .png .

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

0
дададзена

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

string ImageRegPattern = @"(?=(http://[\w./]*?\.jpg|http://[\w./]*?\.png|http://[\w./]*?\.gif))|(?<=(\.jpg|\.png|\.gif))"

Гэта будзе адпавядаць любым пункце ў радку, альбо якое суправаджаецца URL малюнка, або пункту, якая папярэднічае па .jpg , .gif або .png .

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

0
дададзена

Я думаю, што вам патрэбен шматступенны працэс, каб ўставіць падзельнік, які затым можа быць выкарыстаны ў String.split Каманда:

resultString = Regex.Replace(rawString, @"(http://.*?/\w+\.(jpg|png|gif))", "|$1|", RegexOptions.IgnoreCase);
if (a.StartsWith("|")
   a = a.Substring(1);
string a = resultString.Split('|');
0
дададзена

Я думаю, што вам патрэбен шматступенны працэс, каб ўставіць падзельнік, які затым можа быць выкарыстаны ў String.split Каманда:

resultString = Regex.Replace(rawString, @"(http://.*?/\w+\.(jpg|png|gif))", "|$1|", RegexOptions.IgnoreCase);
if (a.StartsWith("|")
   a = a.Substring(1);
string a = resultString.Split('|');
0
дададзена