确定没有标识符的字符串的特定部分?

时间:2019-07-10 12:10:24

标签: c# string extract

我无法从httpwebresponse的大字符串返回中提取特定值。每当站点更改时,响应都是唯一的,但是我需要从源中提取一个数字。这是响应的摘要,我需要提取“ 9”,尽管每次的数字可能都不相同。

这些只是代码片段,这次的源头长达1300行。下次可能是该数字的三倍,而在另一个地方的数字可能是三倍。唯一的常数是它出现在所有HTML标签之外。

                </div>
              <div id="inhoud_content_rechts">
                        <div id="taalkeuze"><a href="index.php" class="taalkeuze_link_actief">EN</a> | <a href="nl/index.php" class="taalkeuze_link">NL</a> | <a href="fr/index.php" class="taalkeuze_link">FR</a> | <a href="es/index.php" class="taalkeuze_link">ES</a></div>

<div id="print_page"><a href="javascript:window.print();" class="taalkeuze_link">â┼' print this page</a></div>                    <h1 class="titel">NEWS</h1>
                    <br />

                    <h1 class="nieuws_titel">12 | 4</h1>
                    9
                    <br /><br />
                    <a href="news.php" class="content_link">Back to overview â┼'</a>
                    <br /><br />
                </div>
            </div>
        </div>

我不能使用正则表达式匹配,因为每次更改源时,我可以想到的唯一标识符是该行在HTML之外,尽管有些事情也是如此。我尝试使用删除所有HTML标记

System.Text.RegularExpressions.Regex regexHTML = new System.Text.RegularExpressions.Regex("<[^>]*>");
text = regexHTML.Replace(text, "");

尽管这样做确实可以减少文本,例如仍然保留文本

                        EN | NL | FR | ES

â┼' print this page                    NEWS


                    12 | 4
                    9

                    Back to overview â┼'

我还尝试了其他几件事:

  • 将所有HTML转换为“ @”,然后将每行添加到列表中,然后跳过不包含“ @”的行-可能是最成功的尝试,但仅包含数字的行无法抓取,我尝试删除所有空格并使用isDigit / isNumber,但返回false。
  • 将整个字符串转换为char并循环遍历每行以找到isDigit-与上述相同的问题

有人知道我该如何写一些可以提取所需数字的东西吗?我想也许删除所有HTML之后,我可以检查该行是否仅包含单个int,但使用isDigit,isNumber和int.parse却没有成功。如果有帮助,以下是经过编辑的字符串之前的尝试。将HTML转换为“ @”并删除所有html

“ @”编辑:

@@@@@@@@@@@@â┼' print this page@@@@@@@@@@@@                    @@@@@@NEWS@@@@@@
                    @@@@@@

                    @@@@@@12 | 4@@@@@@
                    9
                    @@@@@@@@@@@@
                    @@@@@@Back to overview â┼'@@@@@@
                    @@@@@@@@@@@@
                @@@@@@
            @@@@@@

删除所有HTML:

                       EN  |  NL  |  FR  |  ES

  â┼' print this page                       NEWS


                     12 | 4
                    9

                     Back to overview â┼'

TL:DR:提取一个数字,该数字始终出现在HTML之外,没有其他标识符,它在自己的行上。

1 个答案:

答案 0 :(得分:0)

那这样的事情呢?

  int? number = html.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    .Select(l =>
    {
      l = l.Trim();
      if (l.Length == 1 && int.TryParse(l, out int num))
        return (int?)num;
      return null;
    }).FirstOrDefault(n => n != null);

  Console.WriteLine(number);

在我阅读问题时,它是一个数字-因此是l.Length == 1校验。如果可以是任何数字,则可以省略长度检查。

如果搜索到的数字是一行,则此方法有效。


使用正则表达式的替代方法:

  Match match = Regex.Match(html, @"</.+>\s*\n*(?<num>\d+)\s*\n*<.+>");
  if (match.Success)
    Console.WriteLine(match.Groups["num"]);

该模式在结束标记</xxxx>和开始标记<xxx>之间找到一个数字,并且在中间可以有空格和/或换行。

它适用于带有或不带有html的数字