提取字符串 - 如果不是正则表达式,那么什么?

时间:2012-06-14 15:04:58

标签: java string

  

可能重复:
  RegEx match open tags except XHTML self-contained tags

我有一个包含大约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>标签括起的SOMETIMES,有时不是。

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

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

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

。虽然我可以通过整个String,substring和if语句解析这一点,但这似乎比它需要的更麻烦。我正在调查Regex(我第一次这样做),但我对某些语法有点不清楚;我最好看到类似于我的应用程序的代码示例,但是找不到任何非常合适的示例。

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Regular expression parsing HTML is not appropriate because it isn't a regular language. How many times does this have to be asked?除了正则表达式不是一种编程语言,你不能做你想做的计数和簿记,它们用于匹配regular language中的模式。

  

有些人在遇到问题时会想“我知道,我会用   正则表达式。“现在他们有两个问题。 - Jamie Zawinski

正则表达式是专门的工具,它们不会在每个看起来像String的指甲中击败,需要进行模式匹配或搜索或操作。

Jeff Atwood has a good discussion of the cons and pros of regular expressions,如果你对他们了解不多,请在尝试使用之前先阅读他要说的内容。

答案 3 :(得分:0)

您一次只能抓取一件事,一次抓取所有网址,显示名称或空格。我不会使用正则表达式来执行此操作,但如果我绝对不得不使用正则表达式,我会如何处理它:

要获取一行中的网址:\.\./.*\.html?

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

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


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

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

祝你好运!

答案 4 :(得分:-1)

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

以下是PatternsTokenizers

上的一些链接(包含示例)