如何使用indexof和substring解析特定的字符串?

时间:2014-06-29 13:06:42

标签: c# .net

int firstTag = source.IndexOf("data-token=");
int lastTag = source.IndexOf("\"href", firstTag);
int startIndex = firstTag + 12;
int endIndex = lastTag + 5;
string authenticityToken = source.Substring(startIndex, endIndex - startIndex);

我要解析的字符串来自:

<a class="bizLink" data-token="-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4J
jUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_=" 
                           href="

我想只得到&#34;之间的字符串和&#34;只有这个:

-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4J
    jUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_=

但是我用我的代码得到的是我想要的这个长字符串,还包括文件文本的其余部分。

2 个答案:

答案 0 :(得分:4)

理智的方法是使用HTML解析器和查询库。我可以建议CsQuery,它是.NET中类似jQuery的库。您可以使用a[data-token]之类的选择器来匹配您的锚点,然后提取属性值。

这是正确的做事方式。


但是如果你想要获得这个属性并且不再对HTML源做任何事情,可能更容易使用正则表达式,但要注意:parsing HTML with regex is evil

因此,如果您想要做的只是提取这一条信息,作为一种例外措施,您可以使用它:

var m = Regex.Match(source, @"data-token\s*=\s*""(?<token>.+?)""");
var authenticityToken = m.Groups["token"].Value;

但首先尝试使用CsQuery。这是一种很多更好的方法。

答案 1 :(得分:0)

工作示例http://ideone.com/U224iZ

string start = "data-token=";
  string end = " href";

  string source = "<a class='bizLink' data-token='-iUzEhgdscgbpj5VMi5zoh54FTeFt8M4mj5nsiodxR5VzZOhniodpj6nFQg0nce3MhUxFSgdxjM4JjUVzZuNu8o0sREnFSUzISUXzZWh4iodGQfdxR5VzZWh4iodGQfhli6fnce_=1\" href='";

  int firstTag = source.IndexOf(start);
  int lastTag = source.IndexOf(end, firstTag );
  int startIndex = firstTag + start.Length +1;
  int endIndex = lastTag;
  string authenticityToken = source.Substring(startIndex, endIndex - startIndex -1);
  Console.Write(authenticityToken);
  Console.ReadLine();