4

我有的

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";


我尝试使用下面的代码拆分字符串的问题是什么,

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

但结果并不好,Split 方法似乎取出了所有与 ImageRegPattern 匹配的字符串。但我希望他们留下来。我检查了 MSDN 上的 RegEx 页面,似乎没有合适的方法来满足我的需要。那么该怎么做呢?

4

4 回答 4

4

您需要类似这种方法的方法,它首先找到所有匹配项,然后将它们与它们之间的不匹配字符串一起收集到一个列表中。

更新:如果未找到匹配项,则添加条件处理。

private static IEnumerable<string> InclusiveSplit
(
    string source, 
    string pattern
)
{
  List<string> parts = new List<string>();
  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"
于 2013-05-29T19:01:06.620 回答
1

不能简单地低估的力量:

(.*?)([A-Z][\w\s]+(?=http|$))

解释:

  • (.*?): 分组并匹配所有内容,直到找到大写字母,在这个组中你会找到 url
  • (: 开始组
    • [A-Z]: 匹配一个大写字母
    • [\w\s]+: 匹配 az, AZ, 0-9, _, \n, \r, \t, \f " " 任意字符 1 次以上
    • (?=http|$): 向前看,检查后面的内容是http还是行尾
    • ):关闭组(在这里你会找到文本)

在线演示

注意:此解决方案用于匹配字符串,而不是拆分它。

于 2013-05-29T19:15:54.250 回答
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('|');
于 2013-05-29T18:59:53.277 回答
0

这里显而易见的答案当然是不使用拆分,而是匹配图像模式并检索它们。话虽如此,使用拆分并非不可能。

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

这将匹配字符串中后跟图像 url 或前面有 , 或 的点的.jpg任何.gif.png

我真的不建议这样做,我只是说你可以。

于 2013-05-29T18:59:53.773 回答