Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#提取以特定字母开头的字符串部分_C#_Regex_String_Substring_Startswith - Fatal编程技术网

C#提取以特定字母开头的字符串部分

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

我从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
,直到下一个“/”符号


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

这是一份完美的工作:

说明:我们正好符合您需要的确切图案

  • '报价列表/'
  • 后跟(至少一个)“文字字符”(字母、数字、连字符等)的任意组合
  • 后面是斜杠
括号
()
的意思是“捕获此组”(因此我们可以稍后使用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();