我有一个字符串,我从这样的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#提供的子串方法来提取该值...
相反,我在想是否有一个聪明的方法来做到这一点,或许是我搜索的字符串的匹配开头?
例如,我知道每个href都有像我所示的结构这样的事实,所以我只是匹配这些关键字:
offer-listing/
所以我会找到这个关键字并开始提取字符串B002755TC0
的一部分直到下一个“/”符号?
有人可以帮我解决这个问题吗?
对于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;
说明:我们只是匹配您需要的确切模式。
括号()
表示'捕获此组'(因此我们可以稍后使用match.Groups [1]提取它)。
编辑:如果你想从这里提取:/dp/B01KRHBT9Q/
然后你可以使用这种模式:
Regex pattern = new Regex(@"/(\w+)/$");
这将匹配此字符串和前一个字符串。 $
代表字符串的结尾,因此字面意思是:
捕获字符串的最后两个斜杠之间的字符
虽然已经有了一个公认的答案,但我还是想在不使用Regex的情况下分享另一种解决方案。只需在输入+它的长度中找到模式的位置,所以想要的文本将成为下一个字符。找到结束,在想要的文本开始后搜索第一个“/”:
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();