0

Rubyを使用して、テキストのブロックを分割する必要があるドキュメントを解析しようとしています。各ブロックには見出しがあり、その後に不明な長さのテキストが続き、それらを配列にプッシュします。

SECTION 1. A HEADING

Some undetermined length of text,
which can be multiple lines and paragraphs.


SECTION 2. ANOTHER HEADING

Another big block of text.

になる必要があります

["SECTION 1. A HEADING

Some undetermined length of text,
which can be multiple lines and paragraphs.",
"SECTION 2. ANOTHER HEADING

Another big block of text."]

を使用することもできますstring.split(/\n\n\n/)が、各セクションの後に2行の空白行があることを保証できないため、より具体的なものが必要です。もう少し実験することで、私はこれにたどり着きました。

string.split(/(?:^|\n)(SECTION.+\n)/).each do |s|
  sections << s
end

しかし、必要なものを取得するには、出力を再度処理する必要があります。

複数のパスを実行せずにこれを実行する方法はありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

String#scanは、マルチラインモードの正規表現とポジティブルックアヘッドで使用できます。

text = <<ENDTEXT
SECTION 1. A HEADING

Some undetermined length of text,
which can be multiple lines and paragraphs.


SECTION 2. ANOTHER HEADING

Another big block of text.
ENDTEXT

header = /^SECTION\s+\d+\./
sections = text.scan(/(?m)#{header}.*?(?=#{header}|\Z)/)

puts sections.join("\n---\n")

# =>
SECTION 1. A HEADING

Some undetermined length of text,
which can be multiple lines and paragraphs.



---
SECTION 2. ANOTHER HEADING

Another big block of text.
于 2012-06-12T00:18:54.637 に答える
1

String#scanは、要求している配列を提供します。

string.scan /^SECTION(?:(?!SECTION).)*/m
于 2012-06-12T00:17:12.603 に答える