2

可能重复:
正则表达式匹配打开的标签,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 语句来解析它,但这似乎比它需要的更麻烦。我正在研究正则表达式(我第一次这样做),但对某些语法有点不清楚;我最好看到与我的应用程序类似的代码示例,但无法找到任何非常适合的示例。

任何帮助,将不胜感激!

4

5 回答 5

0

如果需要对事物进行计数作为输出,则不应(并且可能不能)使用正则表达式。通常,如果您尝试做的事情由算法描述,您应该对其进行编程。如果您尝试做的事情被描述为“我正在寻找一个看起来像...的字符串/子字符串”,则正则表达式可能是一个好主意。

于 2012-06-14T15:09:10.250 回答
0

我不会说正则表达式,但您可以通过使用脚本语言来避免编写整个程序。Bash/Perl/Powershell/等中有一些工具。看起来它们会更好地满足您的目的。然后,您仍然可以使用 grep 之类的工具来利用正则表达式与其他工具、数据结构、条件等混合的强大功能。此外,如果您要处理繁重的 HTML,那么您可以使用管道工具或致电,让您的生活更轻松。

于 2012-06-14T15:12:48.127 回答
0

正则表达式解析 HTML 是不合适的,因为它不是正则语言。这个要问多少次?除了正则表达式不是一种编程语言,你不能做你想做的计数和记账,它们是为了匹配正则语言中的模式。

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

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

Jeff Atwood 对正则表达式的优缺点进行了很好的讨论,如果您对它们不太了解,请在尝试使用它们之前阅读他所说的内容。

于 2012-06-14T15:37:10.193 回答
0

您一次只能抓取一件事,一次抓取所有 URL、显示名称或空格。我不会使用每个说的正则表达式来做到这一点,但如果我绝对必须使用正则表达式,我会这样做:

要在一行中获取 url:\.\./.*\.html?

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

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


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

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

祝你好运!

于 2012-06-14T16:02:34.200 回答
-1

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

以下是有关模式标记器的一些链接(包含示例)

于 2012-06-14T15:19:13.723 回答