RegEx match for paragraphs
Asked Answered
A

1

6

I can not figure out the correct RegEx to use for parsing a text file and identifying paragraphs.

What I currently have:

[\n\n]+  

Sample Text:

Das Pensionat Klinger war bereits etwas zusammengeschmolzen, als das junge Ehepaar daselbst eintrat. Es war ein unfreundlicher, regnerischer Sommer gewesen. Klagen überall ... aus der Schweiz -- vom Salzkammergut her, wo der berüchtigte »Schnürlregen« tagaus tagein herabgoß -- Klagen vom Ostseestrande und aus dem Engadin ... Klagen endlich auch aus dem lieblichen Gebirgsnest in Süd-Bayern, in welchem man durch schönes Wetter sonst arg verwöhnt war.

Ein so reizendes Stück Erde! Tief gelegen -- hoch gelegen, wie man's eben nehmen wollte, denn die zierlichen, wie aus der Spielzeugschachtel genommenen Häuschen kletterten hier waghalsig die Berge empor, versteckten sich dort eigenwillig unter breitästigen Obstbäumen tief drunten im Thal. Aber die Sonne fand sie alle und übergoß sie mit breiten Strahlenfluten hellen Goldes, und der Bergwind, wie er frisch und kühl vom Gebirge herunterfuhr, strich darüber hin -- und ringsumher griffen die Berge wie die Glieder einer gewaltigen Kette ineinander ... einige grün, dicht bewaldet, die anderen kahl und schroff, hoch oben nur mit kümmerlichem Fichtenwuchs bestanden, und etwelche unter ihnen stolz zu den Wolken aufragend, ewigen Schnee auf dem Haupt, und in den Falten des Obergewandes blauschimmerndes Gletschereis!

I keep getting feedback that at the end of the line I am getting a token back saying TokenParagraph.

For example:

.... and there is a [this is where it miss steps]

Edit:

When trying (\n|^).*?(?=\n|$)

I get,

Preprocessing executable 'Main' for lexing-0.1.0.0.. Tokens.x:22:8: parse error

%wrapper "basic"

$whiteSpace     = [\ \t \f \v \r]
$digit          = 0-9                                                                                     
$alpha          = [a-zA-Z]                          


tokens :-

  $whiteSpace+        ;
  $digit+             ;                              
  (\n|^).*\?(\?=\n|$)   { \s -> TokenParagraph  }  
Acridine answered 3/5, 2018 at 2:46 Comment(8)
Possible duplicate of How to Match Paragraphs in Text with regxIrrationality
I tried that but was receiving a parse error..Acridine
can you paste the error in your question please?Irrationality
just confirming you are using haskell?Irrationality
Yes, Haskell Alex.. creating a lexerAcridine
can you please try this instead? (\n|^).*\?(\?=\n|$)Irrationality
same error as beforeAcridine
haha yes I just posted the important piece above.Acridine
C
1

What I currently have:

[\n\n]+

At a guess: you are expecting this to match arbitrarily many copies of two lines in a row. But in fact [] create a character class regex, which only ever matches one character (any of the ones enclosed by the brackets). So this matches any positive number of newlines, including just one.

It's easy to fix, though the right fix depends on exactly what you want. If you want any number of newlines greater than two to be a paragraph separator, you could try

\n\n+

without brackets. Or, if you want multiple paragraph separators when there are more than two newlines, then perhaps

(\n\n)+

is what you intended. (Not being an alex expert, I can't remember whether parentheses need to be escaped; sorry about that.)

Compress answered 3/5, 2018 at 17:35 Comment(1)
Note that this will not match three-line breaks; it only matches an even number of \ns. If you want any number greater than two, then \n\n+ is what you want.Rottweiler

© 2022 - 2024 — McMap. All rights reserved.