C#提取以特定字母开头的字符串部分
我从HTML文档中提取了一个字符串,如下所示:C#提取以特定字母开头的字符串部分,c#,regex,string,substring,startswith,C#,Regex,String,Substring,Startswith,我从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
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
,直到下一个“/”符号
有人能帮我解决这个问题吗?这是一份完美的工作: 说明:我们正好符合您需要的确切图案
- '报价列表/'
- 后跟(至少一个)“文字字符”(字母、数字、连字符等)的任意组合
- 后面是斜杠
()
的意思是“捕获此组”(因此我们可以稍后使用match.Groups[1]提取它)
编辑:如果您还想从中提取:
/dp/B01KRHBT9Q/
然后您可以使用此模式:
Regex pattern = new Regex(@"/(\w+)/$");
它将匹配此字符串和上一个字符串。$
代表字符串的结尾,因此字面意思是:
捕获字符串最后两个斜杠之间的字符虽然已经有了一个公认的答案,但我想分享另一个解决方案,而不使用正则表达式。只要找到你的模式在输入中的位置+它的长度,那么想要的文本将是下一个字符。要查找结尾,请搜索所需文本开头后的第一个“/”:
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();
您完全可以在这里使用正则表达式。@Pac0您能给我举个例子吗?:)是的,就是这个,它工作得很好!!=)非常感谢你!嘿,如果HREF看起来像这样:/dp/B01KRHBT9Q/?那么您可以使用以下模式:
@/dp/(\w+)/“
。然而,如果你想有一个匹配所有可能性的模式,你应该多解释一点,这样我们就可以在所有可能性中找到共同点。例如:您想要捕获的模式是否总是在HREF结尾?或者:您想要捕获的部分是否总是以大写字母开头,而url的其余部分则不是?@MohammedSohailEbrahim我不确定这里怎么会有多个匹配项,因为\w
无法匹配//code>,正则表达式用$
锚定在字符串的末尾。但一般来说,如果正则表达式有多个匹配项,则可以使用.Match()
获得第一个匹配项,或者使用.matches()
迭代所有匹配项。
string result2 = input.Split(new string[]{"/"},StringSplitOptions.RemoveEmptyEntries)
.ToList().Last();