【问题标题】:C# Extract part of the string that starts with specific lettersC# 提取以特定字母开头的部分字符串
【发布时间】:2017-12-28 12:27:30
【问题描述】:

我有一个从 HTML 文档中提取的字符串,如下所示:

    var elas = htmlDoc.DocumentNode.SelectSingleNode("//a[@class='a-size-small a-link-normal a-text-normal']");
    if (elas != null)
   {
   //
     _extractedString = elas.Attributes["href"].Value;
   }

HREF 属性包含这部分字符串:

gp/offer-listing/B002755TC0/

我正在尝试提取 B002755TC0 值,但这里的问题是字符串的长度会有所不同,我不能简单地使用 C# 提供的 Substring 方法来提取该值...

相反,我在想是否有一种聪明的方法可以做到这一点,也许可以将字符串的开头与我搜索的内容匹配?

例如,我知道每个 href 都有我展示的这种结构,所以我会简单地匹配这些关键字:

offer-listing/

所以我会找到这个关键字并开始提取字符串B002755TC0 的一部分,直到下一个“/”符号?

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这里完全可以使用正则表达式。
  • @Pac0 你能给我举个例子吗? :)

标签: c# regex string substring startswith


【解决方案1】:

对于regular expression 来说,这是一份完美的工作:

string text = "gp/offer-listing/B002755TC0/";

Regex pattern = new Regex(@"offer-listing/(\w+)/");

Match match = pattern.Match(text);
string whatYouAreLookingFor = match.Groups[1].Value;

说明:我们只是匹配您需要的确切模式。

  • 'offer-listing/'
  • 后跟(至少一个)“单词字符”(字母、数字、连字符等)的任意组合,
  • 后跟一个斜线。

括号() 的意思是“捕获这个组”(这样我们以后可以使用match.Groups[1] 提取它)。


编辑:如果你也想从中提取:/dp/B01KRHBT9Q/

那么你可以使用这个模式:

Regex pattern = new Regex(@"/(\w+)/$");

将匹配此字符串和前一个字符串。 $ 代表字符串的结尾,所以这字面意思是:

捕获字符串最后两个斜线之间的字符

【讨论】:

  • 是的,就是这样,它完美地工作!! =) 非常感谢!
  • 嘿,HREF 看起来像这样的情况怎么样:/dp/B01KRHBT9Q/?
  • 那么你可以使用这个模式:@"/dp/(\w+)/"。但是,如果你想要一个匹配所有可能性的模式,你应该多解释一下,这样我们才能在所有可能性中找到一些共同点。例如:您想要捕获的模式总是在 HREF 的末尾吗?
  • 或:您要捕获的部分是否总是以大写字母开头,而 url 的其余部分不是?
  • @MohammedSohailEbrahim 我不确定这里怎么会有多个匹配项,因为\w 不能匹配/,并且正则表达式用$ 锚定在字符串的末尾。但一般来说,如果有多个匹配正则表达式,你会得到第一个匹配.Match(),或者你可以使用.Matches()遍历所有匹配。
【解决方案2】:

虽然已经有一个公认的答案,但我想分享另一个解决方案,而不使用正则表达式。只需在输入中找到您的模式的位置 + 它的长度,所以想要的文本将是下一个字符。要找到结尾,请在所需文本开头之后搜索第一个“/”:

string input = "gp/offer-listing/B002755TC0/";
string pat = "offer-listing/";
int begining = input.IndexOf(pat)+pat.Length;
int end = input.IndexOf("/",begining);
string result = input.Substring(begining,end-begining);

如果您想要的输出始终是最后一块,您也可以使用 split 并获取最后一个非空块:

string result2 = input.Split(new string[]{"/"},StringSplitOptions.RemoveEmptyEntries)
  .ToList().Last();

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2019-03-06
    相关资源
    最近更新 更多