C# 提取以特定字母开头的部分字符串
C# Extract part of the string that starts with specific letters
我有一个从 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
直到下一个“/”符号?
有人可以帮我解决这个问题吗?
对于 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/'
- 后跟(至少一个)'word characters'(字母、数字、连字符等)的任意组合,
- 后跟一个斜杠。
括号()
的意思是'capture this group'(所以我们可以稍后用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);
如果你想要的输出总是最后一块,你也可以使用拆分并得到最后一个非空块:
string result2 = input.Split(new string[]{"/"},StringSplitOptions.RemoveEmptyEntries)
.ToList().Last();
我有一个从 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
直到下一个“/”符号?
有人可以帮我解决这个问题吗?
对于 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/'
- 后跟(至少一个)'word characters'(字母、数字、连字符等)的任意组合,
- 后跟一个斜杠。
括号()
的意思是'capture this group'(所以我们可以稍后用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);
如果你想要的输出总是最后一块,你也可以使用拆分并得到最后一个非空块:
string result2 = input.Split(new string[]{"/"},StringSplitOptions.RemoveEmptyEntries)
.ToList().Last();