【问题标题】:Extracting a string starting with x and ending with y提取以 x 开头并以 y 结尾的字符串
【发布时间】:2010-03-29 01:08:57
【问题描述】:

首先,我对此进行了搜索,并且能够找到如何使用 String.Split() 之类的东西来根据条件提取字符串。但是,我也找不到如何根据结束条件提取它。例如,我有一个包含图像链接的文件:http://i594.photobucket.com/albums/tt27/34/444.jpghttp://i594.photobucket.com/albums/as/asfd/ghjk6.jpg 您会注意到所有图像都以http:// 开头并以.jpg 结尾。但是,.jpg 后面是 http:// 没有空格,这有点困难。

所以基本上我正在尝试找到一种方法(正则表达式?)从以 http:// 开头并以 .jpg 结尾的字符串中提取字符串

【问题讨论】:

  • 它是否只有字符 [a-z]、[A-Z] 和 [:/.] 还是您还期待一些其他符号?是的,Regex 可以解决这个问题。
  • 因为这些是图片的链接,我想几乎什么都可以。数字肯定的,也许-。

标签: c# string


【解决方案1】:

正则表达式是最简单的方法。如果您不熟悉正则表达式,可以查看Regex Buddy。这是一个相对便宜的小工具,我在学习时发现它非常有用。对于您的特定情况,可能的表达式是:

(http://.+?\.jpg)

它可能需要更多的细化,因为有些边界情况可能会导致这种情况发生,但如果文件是一个简单的列表,它会起作用。


您还可以免费快速测试表达式here


根据您的最新评论,如果您也有指向其他非图像的链接,那么您需要确保它不是从 http:// 开始的一个链接,并一直阅读到 .jpg下一张图片。由于 URL 不允许有空格,您可以这样做:

(http://[^\s]+\.jpg)

这基本上是说,“匹配一个以 http:// 开头并以 .jpg 结尾的字符串,其中两个字符之间至少有一个字符,并且这些字符都不是空格”。

【讨论】:

  • +1 for Regex Buddy - 这就是我在帖子中生成 C# 的地方!
  • 我同意通常 x{something goes here}y 类型的问题很容易使用正则表达式解决 - 并且可能是首选方法。但他的具体情况,对.jpg进行简单的拆分仍然是最简单的解决方法。
  • @Wagner,这取决于文件的实际格式。如果它真的是一个没有分隔符或其他文本的简单列表,那么我同意,在 .jpg 上拆分更简单,但也更脆弱。如果需求发生变化,我更喜欢正则表达式,即使是更简单的情况,因为它的灵活性。
  • 我同意。对不起,我忘了提,但那里也有很多非图像可能会破坏它。无论如何,将其标记为输入,并与 Regex Buddy 一起查看您的推荐!
  • 根据您的最新编辑,您是救生员!我刚刚遇到了从 http:// 读取到下一个 .jpg 的确切问题!我只是要解析它两次(首先创建一个以“img source”开头的正则表达式,然后使用你原来的正则表达式)但现在我不必:D RegexBuddy 很有用。你也是。
【解决方案2】:
    Regex RegexObj = new Regex("http://.+?\\.jpg");
Match MatchResults = RegexObj.Match(subject);
while (MatchResults.Success) {
    //Do something with it 
    MatchResults = MatchResults.NextMatch();
     }

【讨论】:

  • 你肯定需要像 Dan 那样的 +,否则你只会匹配零个或一个字符的文件名。
  • 感谢您的回复。但它没有用。我认为这是因为您忘记了 Dan 回复中的 + 号(以及两个 \)。
  • @Ben - Good Catch, @DMan - 这是在 C# 字符串中转义 \ 所必需的。您可以通过将模式放在以 @ 符号为前缀的字符串文字中来避免这样做
  • 对不起,我认为 / 也需要转义,所以我认为您只转义了 .jpg 部分而不是前面。
【解决方案3】:

在您的特定情况下,您始终可以按“.jpg”进行拆分。您可能最终会在数组末尾有一个空元素,并且如果需要,必须在每个文件的末尾附加 .jpg。除此之外,我认为它会起作用。

测试了以下代码,它运行良好:

public void SplitTest()
{
    string test = "http://i594.photobucket.com/albums/tt27/34/444.jpghttp://i594.photobucket.com/albums/as/asfd/ghjk6.jpg";
    string[] items = test.Split(new string[] { ".jpg" }, StringSplitOptions.RemoveEmptyEntries);
}

它甚至摆脱了空条目......

【讨论】:

  • 这适用于给定的示例。但是,它不会正确执行起始的“http”要求。例如,在输入中的某处添加“foobar.jpg”,“foobar”在items 结果中。这很容易通过在Split 之后添加.Where(s => s.StartsWith("http")) 来解决。
【解决方案4】:

以下 LINQ 将由 http: 分隔,并确保仅获取以 jpg 结尾的值。

 var images = from i in imageList.Split(new[] {"http:"}, 
                                     StringSplitOptions.RemoveEmptyEntries)
              where i.EndsWith(".jpg")
              select "http:" + i;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2021-11-24
    • 2023-03-23
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多