【问题标题】:Identify a specific portion of string with no identifiers?识别没有标识符的字符串的特定部分?
【发布时间】:2019-07-10 12:10:24
【问题描述】:

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

这些只是sn-ps,这次的源代码是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 之外且没有其他标识符的数字,它在自己的行中。

【问题讨论】:

  • 有专门的库来处理 HTML 文本。您应该搜索“C# HTML Parser Libraries”。其中最著名的是Html Agility PackRegular expressions to parse Html is a bad idea
  • 这类问题的关键是弄清楚如何识别要提取的文本。如果它确实是它自己的行上的任何文本,您可以使用正则表达式来查找不包含 &lt;&gt; 的行 - 或者您可以使用解析器并查找具有正确类的 h1,并返回它的内容。
  • 我不是在处理 HTML,我正在尝试提取一个甚至不在任何 HTML 中的数字。我还解释说,正则表达式是不可能的,因为源代码经常更改,是的,它真的是靠它自己的……你们都读过这篇文章吗?不要粗鲁,但你刚才所说的都是错误的,不相关的,并且已经在 OP 中解决了。我不是试图使用正则表达式来捕获我只用它来删除所有 HTML 标记的数字。这次源代码超过 1,300 行,下次可能是三倍。文档顶部有大量没有 HTML 的行。
  • 如果我的回复没有帮助,那是因为问题不清楚,而不是因为我没有阅读。粗鲁无济于事。如果一行中有多个文本,你怎么知道你想要哪一个?
  • 你不用再回答了,你真的没救了。我很感激你的努力,但我很累,我已经连续 26 小时在这个项目上工作了,像“你怎么知道你想要哪个”这样的问题只会加剧。我把那是我想要的主题,我想要它的原因与问题无关。我只需要提取 9 并将约束放在我的问题中。我什至把我尝试过的方法放在我已经删除了所有 HTML 的地方,你说你读了这个问题,但你的答案是我已经尝试过并在原始帖子中发布的内容。

标签: c# string extract


【解决方案1】:

这样的事情怎么样:

  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"]);

该模式在结束标记:&lt;/xxxx&gt; 和开始标记:&lt;xxx&gt; 之间找到一个数字,并且它们之间允许有任何空格和/或换行符。

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

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多