提取字符串 - 如果不是正则表达式,那又怎样



可能的重复项:
正则表达式匹配开放标签,但 XHTML 自包含标签除外

我有一个包含大约 2000 行的文件,如下所示:

<nobr>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../Carbon_Monoxide_Poisoning_Prevention.htm"><b>poisoning - prevention</b></a></nobr><br>
<nobr>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../Carbon_Monoxide_Symptoms.htm"><b>symptoms</b></a></nobr><br>

1.) URL 始终采用../foo.html的形式

2.) 显示名称有时用<b> ... </b>标签括起来,有时不括起来。

3.) 文件中的每一行最多包含四个&nbsp;,我需要将其计数并标记为空格。这些最终将用于格式化缩进,所以我需要以某种方式捕获信息。

我需要在分隔的平面文件中具有超链接,显示名称和空格名称的数量,如下所示(基于上述数据):

../Carbon_Monoxide_Poisoning_Prevention.htm,poisoning - prevention,4
../Carbon_Monoxide_Symptoms.htm,symptoms,4

.虽然我可以通过一大堆字符串、子字符串和 if 语句来解析它,但这似乎比它需要的更麻烦。我正在研究正则表达式(我第一次这样做),但对某些语法有点不清楚;我最了解的是与我的应用程序类似的代码示例,但无法找到任何非常适合的示例。

任何帮助将不胜感激!

您一次

只能抓取一件事、一次抓取所有 URL、显示名称或空格。我不会使用正则表达式来执行此操作,但是如果我绝对必须使用正则表达式,我将如何做到这一点:

要在一行中抓取网址:../.*.html?

要获取显示名称:(?<=("|b)>)[a-ZA-Z].+?(?=(</(a|b)))

要抓住空格(简单地):&nbsp;


我将首先按 <br> 标签拆分文件以获取各个行。然后运行上面的正则表达式以提取 url、显示名称和空格,并将它们组合成一个分隔的输出。我确信Java有一个等效preg_match_all来匹配找到的所有模式(对于空格和计数它们很有用)

请注意,这些模式是在Sublime Text中测试的,如果不进行一些调整,可能无法在Java中工作。如果需要,我可以稍后修改我的答案以包含 Java,但对于像这样的一次性事情,您可能最好使用 Python 或其他一些脚本语言。

祝你好运!

如果需要对事物进行任何计数作为输出,您不应该(也可能不能)使用正则表达式。一般来说,如果你试图做的事情是由算法描述的,你应该对它进行编程。 如果您尝试执行的操作被描述为"我正在寻找一个看起来像......的字符串/子字符串......"正则表达式可能是个好主意。

我不会说正则表达式,但你可以通过使用脚本语言来避免编写整个程序。Bash/Perl/Powershell/等中有一些工具似乎更适合您的目的。然后,您仍然可以使用 grep 等工具来利用与其他工具、数据结构、条件等混合的正则表达式的强大功能。 此外,如果您要使用繁重的 HTML,您可以管道或调用一些工具,以使您的生活更轻松。

正则表达式解析HTML是不合适的,因为它不是常规语言。这要问多少次?除了正则表达式不是编程语言之外,您不能执行所需的计数和簿记,它们用于匹配常规语言中的模式。

有些人在遇到问题时会想"我知道,我会用 正则表达式。现在他们有两个问题。——杰米·扎温斯基

正则表达式是专门的工具,它们不是敲打每个看起来像String的钉子的锤子,需要模式匹配或搜索或以其他方式操纵。

杰夫·阿特伍德(Jeff Atwood)对正则表达式的优缺点进行了很好的讨论,如果您对它们了解不多,请在尝试使用它们之前阅读他要说的话。

正则表达式将是解决这个问题的正确方法。以及字符串分词器(用于计算空格)。不过,您将不得不使用子字符串作为在原始字符串中移动的一种方式。

以下是一些关于模式和分词器的链接(包含示例)

相关内容

最新更新