正则表达式自动标记文本。换行问题

时间:2010-02-23 18:44:54

标签: ruby regex markup

我在ruby中遇到一些正则表达式的麻烦。我需要对一些文件进行分类,这些文件的第一行后跟两个换行符,如下例所示:

GIOVIANA

Si scrivono miliardi di poesie
sulla terra ma in Giove è ben diverso.
Neppure una se ne scrive. E certo
la scienza dei gioviani è altra cosa.
Che cosa sia non si sa. È assodato
che la parola uomo lassù desta
ilarità.

空行可以出现在文件的其他位置以及双空行。我尝试了以下正则表达式(和许多其他人)

/\A.*\n\n/

但我没有得到理想的结果。

我也将解释我的整个项目,以防有人对如何做到更好。我需要在纯文本中自动标记文本结构。我可以用正则表达式很好地识别行,句子等等,但我无法告诉我的程序:

如果第一行后跟两个换行符,那么它就是一个磁贴,所以用标题标记标记它并继续第三行 如果第一行后面没有两个换行符,则诗歌没有标题,将第一行标记为标题,然后标记所有诗歌(包括第一行)

在第一种情况下,期望的结果是

[poem}[title}GIOVIANA{title]

[line}[sentence}Si scrivono miliardi di poesie{line]
[line}sulla terra ma in Giove è ben diverso.{sentence]{line]
[line}[sentence}Neppure una se ne scrive.{sentence][sentence} E certo{line]
[line}la scienza dei gioviani è altra cosa.{sentence]{line]
[line}[sentence}Che cosa sia non si sa.{sentence] [sentence}È assodato{line]
[line}che la parola uomo lassù desta{line]
[line}ilarità.{sentence]{line]
{poem]

在一首没有像

这样的标题的诗中
Ora sia il tuo passo
più cauto: a un tiro di sasso
di qui ti si prepara
una più rara scena.

期望的结果是

[poem}[title}[line}[sentence}Ora sia il tuo passo{line]{title]
[line}più cauto: a un tiro di sasso{line]
[line}di qui ti si prepara{line]
[line}una più rara scena.{line]{sentence]{poem]

由于

1 个答案:

答案 0 :(得分:1)

你不需要(复杂的)正则表达式,只需编写一个解析器:

lines = string.split("\r\n") 要么 lines = File.readlines(fname)

然后是这样的:

IN_SENTENCE=false
if lines[1] =~ /\w+/
 puts "[poem}[title}[line}[sentence}#{lines[0].strip}{line]{title]"
 IN_SENTENCE=true
 start = 1
else
 puts "[poem}[title}#{lines[0].strip}{title]"
 start = 2
end
lines[start..lines.size].each do |line|
  #process line
end