Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RegEx match for paragraphs

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  }  
like image 918
mjosh Avatar asked May 03 '18 02:05

mjosh


1 Answers

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.)

like image 175
Daniel Wagner Avatar answered Oct 22 '22 16:10

Daniel Wagner